{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 7.6 卷积网络分类过程可视化" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7.6.1 导入库" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "网络结构由network.py提供[network.py](network.py) \n", "第一个隐层为含有三个节点的全连接层 \n", "第二个隐层为含有两个1x2卷积的卷积层 \n", "第三个隐层为池化层(最大池化)\n", "" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import network\n", "import matplotlib.pyplot as plt\n", "from matplotlib.colors import ListedColormap\n", "from matplotlib import cm,colors\n", "from mpl_toolkits.mplot3d import Axes3D\n", "import numpy as np\n", "from sklearn import datasets\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "plt.rcParams['font.sans-serif'] = ['SimHei']\n", "plt.rcParams['axes.unicode_minus'] = False\n", "np.random.seed(100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7.6.2 定义各类激活函数" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "activation = 'relu'\n", "if activation=='relu':\n", " activation_fn = network.relu_activation\n", "elif activation == 'sigmoid':\n", " activation_fn = network.sigmoid_activation\n", "elif activation == 'tanh':\n", " activation_fn = network.tanh_activation\n", "else:\n", " print(activation+' function not implemented')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7.6.3 导入数据开始训练" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "根据需要设定合适的参数进行训练,net.SGD()函数参数如下:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "training_data #训练数据
\n", "epochs #训练次数
\n", "mini_batch_size #batch大小
\n", "eta #学习率
\n", "lmbda = 0.0 #正则化系数
\n", "evaluation_data=None #验证数据
\n", "monitor_evaluation_cost=False #监测验证损失
\n", "monitor_evaluation_accuracy=True #监测验证精度
\n", "monitor_training_cost=True #监测训练损失
\n", "monitor_training_accuracy=True #监测训练精度
\n", "early_stopping_n = 0 #早停阈值
\n", "verbose = 0 # 是否开启冗余输出,开启之后才能显示上述监测内容
\n", "save_loss=False # 保存损失
\n", "save_delta = False # 保存误差
\n", "save_grad = False # 保存梯度
\n", "save_weights = False # 保存训练过程中的权重
\n", "save_Pl_Pa = False #保存各层偏导
"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"X, y = datasets.make_circles(n_samples=2000, factor=0.3, noise=.1,random_state=123)\n",
"X, X_test, y, y_test = train_test_split(X, y, test_size=0.33)\n",
"c,r = np.mgrid[[slice(X.min()- .2,X.max() + .2,50j)]*2]\n",
"p = np.c_[c.flat,r.flat]\n",
"#归一化\n",
"ss = StandardScaler().fit(X)\n",
"X = ss.transform(X)\n",
"p_0 = ss.transform(p)\n",
"X_test = ss.transform(X_test)\n",
"p = list(np.expand_dims(p_0,2))\n",
"#调整数据数据\n",
"training_data = list([[np.expand_dims(feature,axis=1),label] for feature,label in zip(X,y)])\n",
"test_data = list([[np.expand_dims(feature,axis=1),label] for feature,label in zip(X_test,y_test)])\n",
"#\"\"\"全连接与卷积输入如[2,3,[3,2],1],其中的[3,2]代表卷积核为1*2,个数为卷积核数量为3\"\"\"\n",
"net = network.Network([2,3,[2,2],1],activation_fn=activation_fn,cost=network.BinaryLogCost,layers_type=['FC','C','FC'])\n",
"#是否已经训练且保存中间参数\n",
"have_trained = False\n",
"if have_trained:\n",
" #如果已经训练了就直接加载\n",
" weights_log = np.load('log/weights_log.npy',allow_pickle=True)\n",
" bias_log = np.load('log/bias_log.npy',allow_pickle=True)\n",
" net.set_weights(weights_log[800],bias_log[800])\n",
"else:\n",
" #否则重新训练\n",
" net.default_weight_initializer()\n",
" _ = net.SGD(training_data, 2000, len(training_data), 0.08, evaluation_data=test_data,verbose=1,\n",
" save_Pl_Pa=True,\n",
" save_weights=True,\n",
" save_grad=True,\n",
" save_delta=True,\n",
" save_loss=True,\n",
" monitor_evaluation_accuracy=True,\n",
" monitor_training_accuracy=True,\n",
" monitor_training_cost=True)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 7.6.4 可视化实验数据及实验结果"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAegAAADPCAYAAAA+jkI2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOydd3hc1bX2f2vUe++yJNuyJfcmd2MbgzEGbCBACBAgnZQLKTf3SyGFBBICCUlu6g1pJLkhIQkXCL3bYIxt3LssF9mWrN57mVnfH2tGXe5FyOd9nnk05Zx99ozO3mvvtd71LlFVHDhw4MCBAwdDC64L3QEHDhw4cODAQX84BtqBAwcOHDgYgnAMtAMHDhw4cDAE4RhoBw4cOHDgYAjCMdAOHDhw4MDBEIRjoB04cODAgYMhCMdAX2CIyJdF5MsXuh8ngojcJyL3Xeh+OHAwXCEij4nIRy50PxwMHTgG+jQgItEi8oWz0Zaq/khVf3Q22nLgYLjjbI29szmGHTg4V3AM9OkhGnAGtwMH5x9na+w5Y9jBkIdjoE8RIvI48B4wQkRKReSlHp+tEpEbReRpEXmjx/ufFpEjIlIsIl/p014v17GILPa284iIVIrIWyIScoI+3SUiR0WkXEQeON51vW0/KSIlIvKgiBwTkXu9/XhWRPZ4z1lxEr/FVSKyV0TK+nyHAfvjwMGZ4ARj76MictB7X3+yx/vf8d7jJSLy2RO1c5xr92unx/vF3jFzu/e9QhF5vMcYKxeRO7wu7H+IyCERyReROSdx3ZP+Xg6GIVTVeZziA8gCCgd4fxWwD1gJRHnfCwbeAVKBUKACCO9xzn3AfT1eLwbagP8AAoCtwPUn6E89MNF7rX8CEYNd19vHbwA/Al4DrgHe8PbjIBADTPEeH3qcfiYAB4AM7/V2AdMG68+F/p85j+HxGGjsAROAHUAskAQUe//GAu3eezoOePJ47RznmgO247333wDCvOOs1Pt+IfBh4F/A77xj+Q/AY8C7QBCwAtjb5zqPAR85k+/lPIbXw9lBn338QVX/rap1AKraCtwB3A78Axtc8Sdoowz4pap2ANuAqBMcvwb4HnAL8BlVbTjBdd8FGnv89d0HT6tqjapu8/Zh7HGuOQdIAzYABdgENWGw/pyg/w4cnAmWAKOA3dh4CQdygDogH/gJsBS48zTbH7AdVT2Cucn/E/grZjx9GGyM/U1V21T1WSBdRKIv4PdyMMThGOizj3U9X4jIaOAtoBobyEdPoo1DquqrYnIy1UxWAj/DBu9OEUk4wXXdff52dbfHcxfgOc41BXhTVZNVNRlIB54crD8n8R0cODhdCPDnPvfiOlV1AzOxnewiYIuIBJ5q44O1IyKXAE9hnqeP9DntZMaYcOIxds6+l4OhD8dAnx6qgDgRCfU+jhcjnoa5vP6AGaz0k2j/pEuMiUgosBPYDHwLW61nn+Z1rxORGBGZhrnOCo5z7DpgmojkeCeHV4ErjtMfBw7OBgYae28Ay0UkWUQisN3meBEZC7zufXwFSMbu68HaGRDHaWc25kH6G3DVSfb/VhEJFpHrsIV4/XGOPZ3v5WAYwf9Cd+D9CFVtEJGHsBisC5iLraIHwmvAFzGX8SvAIcx1XHiW+tIsIr/CYlUBwAvYpBExyHWPhy2YezoC+JiqthznuuUi8gng397j/6aqzwAM0h8HDs4YA409Vd0pIvdj7mR/4KequhVARN7G7n2AX6hqyWDtMMgYVtV9A7UjIv/C3MvHsDBSo9d4Hg8FGF+jEws/He+7nvL3cjC8IN2eVAcXM3wsbFW978L2xIGD4QkReQxYpaqPXeCuOHifwHFxO3DgwIEDB0MQzg7agQMHDhw4GIJwdtAOHDhw4MDBWYCIJHn5AYN9HuAVhHpHRD52ovYcA+3AgQMHDhycIUQkBvgTJlwzGO4GNqnqfOBGLzt/UDgG2oEDBw4cODhzuIGbMSXFwbAYY/yD6VTkHa/Bc55mFR8fr1lZWef6Mg4cnHds2rSpUlWHjAiLM9YcDFecj7EWmjVD3S2D29b28v27gNYebz2qqo/6Xvhy2kWk76k9EYZJtoKJSCUd59hzb6CzsrLYuHHjub6MAwfnHSJy+EL3oSecseZguOJ8jDVPawMZd/x80M/3/2h5q6oed8d7EmgEQjC51nDv60HhuLgdOHDgwIEDwOWSQR9nCZuABd7nUziBYJWjJObAgQMHDi56iICf31kzxIjIEmC8qv6ix9t/Al7w6riPB9Yfrw3HQDtw4MCBAwdwVnbKqrrY+/cNTE+952eHRWQptov+lrfwyaBwDPQQhjaUQ80RCAyD+FGIf9DZaVcVqg5CUxVEJCGxmWelXQdnHyISBfwd8AOagJtVtf3C9mpoQTtaobMVgiIQl9+5u059KdQWQXAExI1C/ALO/jUaK6ClHkKjkTCn/sX5xNneQQ8GVfVpt58QjoEeotCmavSNH0H5PgDksv+CUfPPTuMV+9Hnvg7uDjP+K77vGOmhi9uAH6vqqyLya+BKrECJA0DrStD1f4TKgzDlAzB2CRIQfPbaV0VE0IZy9JXvgccNoy8BtxtJGX/WrgOgtUXoy9+D+hKIGwmXfwWJTD6r13BwPAgu19CiZQ2t3jjoRnNVl3EG0PzXzlrTWn3YjDNAexPUOYVwhipU9Veq+qr3ZQJQfiH7M9SgB9+BwxugqRLWPgrVZ4fsq01VeDb/A33xPrRwPdpUC+4OJGcpbPkXvPQdtGjr6bWtina00E9muabItnHigqpD9jid9qsP43n7l3je/T1aV3ziExwA9tOfB5LYKcEx0EMVQZEQEtP9Om3qoIdqcw3aVHXSTfdalYsfhDuutKEOEZkLxKjquj7vf0pENorIxoqKigvUuwsId1vv157OkzpNO1rRxkq0vXngz49ugk2PQ/E29LWHEG2H7MXopr+BuqGzDV3za/Q4ebMDwdNYgW76O/rvr6Ob/4GnuQ71uNH6ErRiH4ycjyy8G/wCzLt1itDmGvTVH8DeV2Hns+g7v0U7Bq0a66AP/Pxk0MeFgOPiPgvQlnoo2402VSHJE5C4rDNuUyKT4Kr70JKdSGgMJA3sTtPSPeYKd3fA4i9C+tQTJcpD4ljkym+i1UeQ2Ew0Mo0Lc/s5OBmISCzwc+CGvp95hRIeBcjLy7voKt/I6IVo4XqLDU+6Dk4iVOOpPAQ7/w2F6yBtGsz9KBLeRwOjocdiRz3g8UDWXNj1Ari9FICAUDjFmLeU5aNbngC/QCQ4HF39U9Tlj2QvQsIT0eItaEstLL/P3Nynis52aCjrfl1bZO8FhJx6WxcZRIaei9sx0GcBWrgW1vyPPQ+OgpUPIlGpZ9yuxGYeNzbsaamDt35uZC9AX38YufFn0Hey6Yv6UvT1H4HHjbrbkSvuhcyZZ9xfB2cfIhII/BP4mqoOKWGUoQCJGQFX3w8drRASdcL4szbXIsVb0YI37Y3CtTByDmT3HjMyci665yVoa4AR01EROLweWfIldNtT0NGCLPg0EnSKu9z2Jvs7ZjG681moL7V+NVZAYg4UerNuOlvRRZ8/9YVzaDTMuBU2/i8gSN5tRmpzcFK4UDvlweAY6LOBou3dz1vroLUBok6tCR8ZZfDPPdBSBy5/8A+0gVx3rM9R4n2c4Fqt9ci0m8DdgbY1ohUFyGkYaG1rhNI9aH0pkjweSRh9ym04OCE+DkwH7hWRe4Ffq+oTF7hPQwoSEgUhJzng3O1G9OoJ9aDNNRAQjHh3mhI/Cq57GNqa0Y5meP6bdqjLH1nxIMSkdx17MtDONmiuRRPGQMIYc18313Yf0FzTezdeWwzl+WjyOEROflcn/kEw4WpIm2ztRY84pfMvZvhi0EMJjoE+BWhLHVq4DsrykexLIHUy4vJDxiyyXTRA3Cg4hfQI9bjh2HZ0+zNo/Chk/PJ+7jb1uOHwBvSd30BINDL7I+ibP4aAEGTWHei2/zMCy+IvIOHxfdreaQSzhGzrc1AE+Pmjm/9hqSnxo2HuJ07vBynaau51QANC4NqHkJiM02vLwYBQ1V8Dv77Q/Rg2CI1Bo9Ng1AI4uhFSp6BB4bD9Kagrhbkf6+JoSGQK2t4EhRu6z/d0QlvDqRnn9iZ053Ow+QmITEYWfR5VDxKVir79KxBB5n4c9ZE1xYVkL0Lf/Ams+D5EJJ7SV5TAEEgce0rnODAMix30RZubWbwN1thcqftXIdc+DAnZkD4NWfEDaG+A6IzeRrKuBFrrITwOCYvv32bNUUut8HRC8VY0IBSZdmPvYxrKzSWtbmiptdxogI4WdMNfYNE9SOJYJCy293nVR9CXvmvnHV4PMSPQrf8C9SCz70TX/REqDyDqOa2fQ8vzu190tEBzHRraZG68oHAkMPS02nUwvKHuDqgqhI5miE4/v/m+1Ydh90swaaUtTkt2wssPQPZiaKlBC9ehLXUQGoOExaGb/w4RycjM29H3/gLhiRCZcmrXrCmCTX+z53XH0IJVuBbchSZkI4k59n50KjTXmYve3YHufQXam21b5+C8YDjFoC/K3Eyt75GOpB6LTwHiHwjJuf2PrypEX/iWGej40XD5/0Mi+hQv6WjpzTztcQ2tPIAeWANB4bDo87Dqx95Lu43VXbzVdtFRqRAQbHGswLBuw9jeaMYZjIF6+D2IzbKFwI5nYMxi2P8WBEf27ndLvaWtBIYgx5mMJGMmuut5+y0iU9DgCFj933B0s+Vsz7rDEVtw0B9HNqKvPQwojJgBi+5GQqLPqEmtLzUyVHiC7SAHO27/W3BsG5Iy3hjZPpTnWwy4pRbyX0cmrUTfeMTu7ZqjaEgMsvJBCI6GtkY86x6D6FRkxEwkLGbQ6wH9iWTeOLn4BaDBkdDZAp3tuMLj0JQJ6KqfgqcDueKrvbxpWlUI1YUQGmtEz7OY7+3A4DccXNyq+qseLy+a3EwZMQPd/rQZ1fjREJV23OO1ZIcZZ4DKAzbQ3Z3GzA4IhZTxEJUKoxfCgbcgIBTJXQaAp7ESXnnQDCVA9iKY/iHY97oxtRPGwLhlaHQ6BIaiW56EgjcgeRzM+Zjt4qNSIXUyHNuOjJiGbn8K6stg3DKbkFImIjmXG9HG1+eWOttZ719lC4Pl9yEJ2f2+m6ep2pihV34LaWtAE8YgNcXoYa87cP9qGDnvlNz9DoY/1ONGd78AeAnnRzdBUzWcgYHW0j3mKepogWk3w+RrB/feRCTauAlPtMXB0U32/ogZ0N4Cibnmvg6NM+PsQ3sDJOZCXbEtur2pSzrnY8iklQN8z04jrgWGQkwGsvBuWxDEZiC5S+2Y2iL01Yeg9iiMWw55t9hYW/kgeDwWW/e1V3MUff4b0GbFjxxi59mHyDAx0D4cLzcT+BRARsbwiUlKQjZc+0Noq4fwxF6u7AGPD4unO+9F0JAYePUHUHvU3p90LTLrDmTeJ9CJKxB3BxoYYlSvtkbUZ5z9AiA2E4kbhY6cj1QXohv+ZEa7ow38/KC+CMZdYYpK5fsgPN52r4u/AC21Fof2CZ9s+Qey7BswYnp/AknVQTPOAG2N6N5XbVfSc7KoPmyLh8ZyGH8VGjcSdr+IetzI7I9a39RjggsOHPSAuPzQ5PFwbIe9ERwFp8qE7gH1uM0N7cv13fKEsbL7pCipp9OyHZLHQ8Eq2PMyTLsJGXsZBISgEUlIWz368vfQtgYYfxVMvRG2/guCI5GcpehL9yM5l3dfC3qJCXVdq7EK3f5/FhLLXYbkLIExi5GMGeAf3LXz1QNrzDgD7H3ZDO6I6UjQAKzr5uou4wygpbtPi9jp4PgYNgb6Ys3NlJj0436uHrcNus4ONCEb5t8Fxdth/HKk+hDqG5AARVth+s02caz6CVp3DNKm4plxC0SlwJhLjbASm4mu/Z0Z7IhkmPZBc8FVFSLJuWjBKmN1F65HZn+0V9xKwmIhLBbd24e5GhzZzzhr2R5TLxJX9+4hIAh96X5Y+DnwEsB053PQYOkh7HrOSC87nrHPYrNg3JXWhwF23g4cSO4VaFg8NFUiWXP6h32OA1WPeaVcAUhQmBn8ntwOvwB79DzH3QEH1qBv/xKZfjNaud8+2PJPdOHduEbNQwDP5re7wlbsfgGu+g4y5lK0tc67Q29Fw+MhZQKU7ALxM4PdFyU7YNfz9nzd7yEuC0md1N9LEJ0Gkcm2AM7IQ8v3Gbs7cWz/jI7wBDu/xZjfkjr5pH8zByeH86XFfSo4XZKYk5s5GI5uNiUfddsOefrNyPjl6JGNJg3odTkDkHMZ2lhtK21fylTxViRrNpKUg064Gn35AWT8cnN1p09FksdDcLgpINWXGMEsZSJMuhYOroGIJAgIxtNUjSssFq08hFbsQ0YtQEt2QUM5TFqJhkT1S8jS/NegdI8RyArXm+iDqi04ao6a6zsiuc8E6JUmTMwxt3ldMSz5TyQi8awV93AwvCBhcV1u3lOBejqhcAP67u8sDrvoHiQ2A5l6A+o2gQ7Ju61/6KmhHH3r57bodPWe8iQovPt5eEK3x0tcSGAoEp0G+w9aQQ6Ava/A8u8g01y28x9Ap0A7WiBhDDJ6gbnN+37e3mSx8IJVFgaKH42+/kP7bNuTyMqHIH5U735GpcLV3zXCWWg0xDuL37MNQfAbYqS8091BX/S5mepx2yDu8Q/VjjZzt/mIWTuegZzL0cZKM8AH18CEq5GUiRCZhB5cCwfXWEpFz8Z9k0Zzta2Y/YPNAEamohsfBwSZ98luec+SnUj6NJh6k6VfhUTDqHno6IXo89+E9iZU/GDpV013u/ogUlcKEUloewuU70UbypERM9GGSmOST74e9QuA1T+DsZcZg7WxAtiOXP5Vc3M3lCG5S9Gd/4aMPDPQ024Gtxvd9yaEx0NSbq9J0IGD04GqB+pKLK1PPdBcjW78Kyz9ihmvS78IHvfAFabEZUQttwct2gIzbrOxlT4NjRvZvVBNnwaz7oCSXci4ZUaoBDOWkSlG4IxKRyISjitEJKlTTATo3d/ZG2HxcM0D3RK7Ffvhnd/Y8/J85JL/6B7/7o6uXXK/dmMyurxYDs4N/PyGVljudEliF3VuppbtNUMZGgPTP4j4VuwNZea+qzsGO581d5V/EJTlowfeRvJuNeH9xLHQUmOpT4COWw5jlhiRLHshmjjWJo3QWBA/0wWefD289pCvB+iOpyF1IuzzlhuNy0L3vgY5l9mEVFtskn8+5SJ1w4E1yNjFaPFmaGsw11/xNvS1H9ghadNg9HyoPozu+qUxxBfdY59VFXoNNOihdy2WF5WC7nvDdtkZs5D06WhQKPz7axa/BuTSL1qs3IGDHtC6Eqg9Yprz8aMtE2Kg49qbbSG7fzUy8Rq713xwd9hrwcI1g02ukcnI0q+ja39jxK3MmbDnRXj9YUidiC74DBKRhITGIFM+YFWxekCi02z32lJnamUnUOqT6FQ8O57qfqOp0sJYPgPdRxtb1Q1+gSaiEhZv4973WUudiZgEhZ+Q8+LgzDDsSGIXI7ShDH3xu5bDiVch6LL/gqpC2612NEP0CJj/aSR+JBKRiDaUQUWB7XjjR0P6DHjlge5GG0qtetXSr9rxtUV4SneDXxCy7F6LTQVHWhyq0UuYj0qDuGyI2AkjF6DB0RAzwgb/zmetb7GZlrfZWA4IkjAaLd0LZfvQ4u3Iyocs7uyFJI+D5hp013P2RkeLyRG6/JGJ16Ble20yHDkbYjJNCjFlIjJpBeLbbZTsMoUx3+9VuhsZwEA7E8/FC22osNKNtUUAyNKvodEj0EPvgH8gkjm7x26zAN7+hZ3X0WyEyvWPmWDPzA+fVP1nEYER0+Dah83FXboH3fOyfVi01eLJJ4iDS3jCiSV0ex6fNtUIlmBjN7RHKlbsyO6QUFSaha0W3WPhIVV090sw8Wqo3G9x72PbofIQLLu3V8aFg7MLwTHQQxraWm8ynUHhvVjLvdDZ0WWcAWissPzjY9u63689ioTHWSoUWDxq8RfRo5uQ+FHosW3GEN33hg3UiEQkYyYSlYKnZBccetfaS5lsu+1dz8Hu520i2/emTWKpk2xxMOUmyMhDAoPR5hxLtfJh+9PI8m9D6W7wD0b3vY5MuBpm3IwWboD2ZiR9Grrj34BabNnd0b2aB2PZNlejtUXI9Y/YMVEppqA29+P9f5+w+G53IIJkzOp3iKe2CCnebkUBCtfDZV92Jp6LCU2VXcYZQA+usScH3rbXpXth8eeN7dyz2lTlAXTqTchNvwI/fyQ0xnL22xshKBIJPn4oRbz5/to3u2CQuKN6JUFPZhHQD+nTkOX3macsblQvl7hEJlm4qaXWdLLFD137W5MJBhh/Nfr6w1DjJZROWgmVhyw90xkn5w4ijoEeqtCGCvTtX5r4R2IOXPrFgYulh8fDtA/Cln+AXwCSe4VNNkERvQgmBPYgnwQEo9EjYNuT6OH14O60ghqjFqAh0bhCu9mdUnu0ewdbcxSJH9m1I9X8N5CJV6NvPGICIeIy1nb9MSONxI9EAq9Cj7xnBjZ1Ilq6xyQFC9dB5mxzlxeuRy75HMSkQXCUCTC01KIRKVB3zHYpe16BsDgkIRvd+Dgy+Vq0sQxX1pyBf7/aIvsdQmIsN7r2qO0c4nrrc2tDBaz+uamQBUcaq/bYdmfiuZgQEm0LP59BSpkIGx/v/rxin7miA4LRqFRk9kdML7toGxJjMWAArS8zUY+yPTAiDxbcdUL3MwAJoy1klP8apE2B5In9DtGao+h7/2v9mHX7gFoAx4MEhkL64CViJTSma1etHW0W//amN0rMCHT3890Hl+2F6LSuBUZXH5uqvG73yIFVCh2cEpwd9FBG5X4zzmCup7L87phRD0hAMJo+tWtVreKCl78HWbOQuZ9Ay/ciCTlo8VaISkUFpKHCcpUX3QOVB5HYDHTVTy1WPXohntylxmyNSqVfsYvOHgqqUSkmVejbfagH/PzBFYC++n2LEc+6Exbeg9QXm7rSpsfhqu8iE1eiBau7quVoZyvS2gihcUiSqaDp7hdh4+PoiOkm3JA5C6oOIHM/hq7/s1XYiUrtpbetTVVoawOs/jlUHbBFw/JvI5n9d86AxR19EqGt9VZoY5BSmg6GJyQqBa76Dlqej4TGofGjjETpTdVj0nUQHGEFLNY/ZsQucSFLv4pE90hzLM834wymq115eZcbWjtajIzV1gAxWUh0jx1scCTMuAUmXmPKe30UuTw1R+GtX0L5Xmvr5SNw/SP9pXTP1u8REAQzb7Mxp240frQV1KgosAMyZiFxIy085oXWldguu+qQhdSu+NpZqaB3UUPAb5hIfQ4/+AfZY8JViH8wGho9eF2oiCQ0vgUOvYMERaJjl0BUmsWaqw+b+9jdbizQiv3o1n/aBLPky2hoDHpoXXda1YG3kOg0NP91m7SSxhsBq3S3DdLYTMicbQpIDWU2SH0uaP8gEz/Z+YylagH62sPIld9CVz1hBjwp1ya4kp2WsznvLrSlBvELhLK96Pan0IgkGLsECY6CiStsB75/NZKUA+3NFvPzoepwdz50yS5LKfN0IjNuQVvrjIDTUIYe3QIJo/ut+q0ureBTkpLodEjOOUv/RAfvF0hcVlfddAF06o2QMRNcLogdafnNjZVQtMVOUA+699XeC7++jG1Xj9dHNnUVciEqFa6+v5fsrPgHgn9/lTutOGCiIS3V3W+21oOn4wy+7Ykh4QldJS8F0CVfNgPd3oQeeQ/d+k9k2TctxQrMMFcdsue1R20xcgIDrfWl6K4XoKkCmXw94hTU6AVnBz2UEZ9tBvTtX1psdMylaGxWv1i01pfCu783JaSpN0D8SNjzkr0efUl33AgsnrvtSe+JHlPYSpsKIX2Mll+g7YQbK3ClTUYv/4qJ6rfUQuke2xlXHoCmSjQ+21zSJbtttd1SB21NPTrotuo4S75ssoQRibD2d8jk61BvoQ/iRqFzPmqscB+hq7kGrTpknoRpHzRZw7iR/dXAvBOEttRbbqlX2EE3Pm6iLIfX2U4cYNpNJqrSYyLVznarwHVsuwmwxI3CFXpudiYO3j+Q4AgT9mlrQBsrjK8Rm2WZEL5MhMQ+C7mkHJi4Eg5vsEyBxDFdH+mhtd1tZy9Gtz6Jtjcik65F4nuHXXpCKwvgyHvIpOvQDX+28TT/U72Y1ecDEpmENtd0LzLweriiU5HQWJMQ7YnA46uxeTparWDH/tXWVvF28woMFMa7SCE4MeghCwmJxFO6qzsHseBNyLm8V51ZrTxgsdmoVNvR7l9tq/war1aLiBWJqCpExl2JNlXY+c019nl4gpFGQqJg7KVQXmALgbgsiyE3VaHtTUhIFFp3zOK4qtan5mrwC7SdR/xotKYIXfUTGH8VMmq+GdfWephyvbG+97wE465EmmvR6DTTBfeh6iDSXGPCD1NvNNH+9pbuohlbn4Qb/ttIOAGhyFJv3nPSeDQ80TwLIr1FH1x+Vp7PV3AeTIhhwjUQEoU2VVtRkJrDVlErOt3SvlL6x/8cXDxQdwfUlxohK/9Vk+BMGAOpk9A3H0EW3Y16w02S0VvaUkJjLW952o0QGIr0uB8lI8+MdOokGw9HN9r1irfBdY8MmjkgEV7DuOclZPrNFh9PyB44v/pcIzCkm7gJEBZrG4DQWFPpm3+XEeuy5vYrL6kdrZbRERiO+AdYHLtn/fj2pt7hMwdeF7djoIcueqZCINAjN1PrS9EX7uuWAsy53FIzesYstv4Lrrof8l9Da46CepCpN6FHNhozfMp16JYnEb9ANDLVdtN1JeaeLtmJHngLCfkWjJgO8aOMHLZ/NUz+gE0+YTGoyw+KtqApE4wl2t5s/Z58XXd1nLd/BZ2tSOJYc1973FYxp8gbYw+JtpSVSz6Hrv2tsddHzuuuOxsSiQSFmsve7UaTxkFTFVK620RNErIheQKy6B4j6bg7jUTW1mgThU+fOGUi6vEY+/aNHyOjFyJxWWjuMtjxtLG9o49fcMTB8IV63HBwDbr6Fya845PHLNtjOf6d7ei2p5Fr7h/UQIqfP/hF9v8gc7aFehTY8Mfu91vqvOVfByFVJeYiV3zdjHryOEga28vwn1fEZJhXL/9Vm2s8nV1ufAkKN4XC3Cu6+TDtLeAfAE016Ma/mMRw7kA7sxsAACAASURBVDJTGdz7sm0a2hqgvtQWzuFOIZueEMDfMdBDF5I111zY5fuQyR+AmCzAm+vcUtdtnMFWozlLzRVVdciEQcZfCRUFSOpEtOBN200njoGsObh8BJMFd5nx3vBnI7lEpiDTP2ilGpur0aYqK5bhH4SmTEZErExkdBrqHwTPfMV2vhNXQt5tRjABiM1CKwqstq273Ziy4Qm4IpNg6gfwlBcgwVFGDvMLQnc+j6aM7662dWitTZKpk21H3lSNlOcbCzxhDBoeb3rbDd6c6mX3mssxcya0NaGb/g65SyFrHpI+Hfy9ixBPB7r9WSTvNnTNr8ylHpsF13wPCYv17lhqoWgzWnMUyZqLJDmxsYsCzTXomkeR2Xd0p/X5IC5ATebW5WeLSP/gQQVN+kKCwmyh294MuVeYTK167Ll/4KD8EgkMgcxZg5MczyNEBE3KsTSyI1uQzLxeRDHwFh9xd1gJz81PGD9k7KVWRhaseEjaFCv2cfAd+24pE9HodOQEbvGLDSKOgR7SkIhEmPdJ6OzoMnzaUotufdJcQpmzTf1LXEjuMnTvq2jZblj6NYtBH3oXaovQjDxY9i1cgd66rz2vERxp7GUfk7m+xFjQDeW2y+6RziH1RV0kLAWL3fpiwntfsfxIbz8lMMRcg1d83RYTcSONLdv13RIshtXeBKmTkLxb0PqyHh1zdRXJ0LW/tZX7u7+31wfXIJf+J9rgqyqq6OENJtjvF4REhMGkFWh5gakw1RahbY2IgPqHIulT0Ip93fHu6kKkvcmEUcBSz7zxcd39Ilz3Qyft6n0MbW8xoxIQaobS935nu6VW+QcjwRHGu0iZYLtVVci9wsZQ8gRInWI5+tHpSMEqdMs/bGE3+87j1ijvCwkMxROeiMy41e7lwFBLcXqfQEKikbGXodmLB8/Hri0yLW/1WL3okGjLQKm3gjYqAu/+rsvFrbXFyGX/Zc9b682FHhJ9evnewwi2gz7DNkR+D4wHnlfVBwb4PAb4K5AIbFLVu47XnmOg+0DE1WX0AIsTe5W5GLPEbuzwBNsxVuyzQfHOb2z3WfiuiRLk3YYE9i+mrg3laNFmqwXd85qhsWZYQ2N6p5G01ptby3d+U7WRQVrarZZ0QO/C9BIYMmjupYREw9yPWTw7INRSRhorLJWlPB+ZcBW69f8snu7yh85WetXD9QswjXBfPdqUibbkDI40zWFxIZf9lzG7N/6v9TcsHhZ+zqoI5d3Wq/QmgGfnc6YhXrG/+zqdrSYW4+B9CW2uQTf+zQRz0ibD/LvMS9LebC7sLf+0zITFXzAJzdkfsTrJh9baAjN7IWQvwuWLqVbsR1f/zJ7Xl6IxmUjeLafUJ0mfbgI67nbkfbpzPK7xdLf3HqttDZA03hb9uUuRoHDzDPpQcwQ620wV8c2fQGMFMudj6OiFFq++WCHgfwbVrETkA4Cfqs4VkT+IyBhVLehz2O3AX1X1ryLyuIjkqerGwdoc9gZa3R1mPE5xdagtdaaG1bVrxDvpTEGj0pDshWjcKCRxDNpUYzGi638MuEA8eNqbkdoiS42KTEZjMmHzE7DvdTRtipWZPLLJikykTjQD2hdRqRCTaUbTPwgZOddqL6sHSZsMLpdpGvsHnVSOpgSFdxfiwJvaMfPDaNVhy9+edQfaWm/CJv6BEJUOdUUQEAoRCcjy+9DKA0awScw1cRJfCpZ60P2reys/NVVaXWtV20FP+yDUFiEj56Eb/mKEsczZpl9e8KYtRrzKag6GLrS+DN39AtSXIlOuQ5LGdX9YeQDyX7HnRzdbtkFEkuXvb/yrvV9RgO5fZQvZmHQYeylac9gMR9oU6Fk6prOt98U7mozr0NZoxLC+aXwDQPwDTJxkuCIqzeLMO54xrfCJK4yQOuNDEBRhnrGpN9jiCGwcBoWj7/7WdtyAvvULY7d7U98uRpxENat4EelpTB/1llb2YTHwD+/zV4AFQF8DXQVMFJFoYARwlONg2BpoVTXi1Xv/CxEJMOPWARP5teaIVcmJSEQ621BXgLGZtz8DzZVm0EbNh8PvQepkM8qlu4wcBahfoOUAv/htmPdJRLEqO+GJMGKa5RC7/JFrHujWvfaVl7z6flw90hzU3WGTV+0xc/EmZFust6HUFL9iM5GUCXZsezO69xVY90cIS4Arv4EMUPruhCjPh+e/aW2KC1nxIJKUY/Vxl38LaSiH0Cgk2lzOPhe8drZB8Q5jlPr0wTtaLX7tK6cZPxr1uJH5n0Kbq20RMmo+uu1pI61lzjKG99pHTS0qItFc844295CGbn/aik2AydZe/+PusdU3LQ+8C7fW3m9KjwVzUKSxpQNCoKMFCU+06lVF24xgOW65XS8iCcYsQdf8j1WGS5kIC+826cyLGW2NMGoBMnqhETx9amrBEd3HTLrOagC4/CA2w2LXPQuPODgZklilquYd5/MwoNj7vBqr+NgXa4CrgXuAPd7jBsWwNdDUl6Av3W/un/J8FJfJd/YsD1lzBH32XsiaA2GxRrIIDEOWfAltqjQjUrjOajhPWmkG5Y0foWk9iqW72+3RUoeIq7scXn0JGhhq6VOV+y2XecLVsPa3dl7qFCQoonefKwqsPygqfsjKHyCJY/rtKLX6sE2S6kFm3Ylu+DO652Vk/qdO/XfyVqiyhq2MH3jd6cXb0KZKJHN2//PcHVDwprn281+xRciYS1EEmXUn+PmjiTmw5xV032vWZtxI0yVPzkVdgoyYbguohjJzk49bjmsIkHMcDA71uE0Yw4eOVgtL+BA/GqbfAk0VEJGCRibDs1/zjqFrTX8+NhNJyMbz2sMmnpM22WLVne1oSKQtkGuPWUENT6c3Y+DzaNoUpPJAt3Z3yU5jfF/EBlprjlp2SXMVGpmCXPmNAY+ToDBI9ioGNtegRVuNR1NbBI2VyJyPnlDoZLhDztDFDTQCvrhjODBQRPvbwKdVtV5EvgR8FHh0gOOA4Wyg3R29maFNVZZu5NfjK9eXQlsDkj61q2A67U1m/EYvNAGQpHGw+e+QlAvVR0ykP26k1VdWt+U0i3h3DtI7FtTZarFbl78RN4q2InM+BmFxaPL4XgSarv743Hvqtp1pD/EFAG2uRV97qJvwkVQOWbNOKFQwKGIzrd50Z6u5w7yDVPe+Cpv/Zs93vwjXPtxL1ECCwiHvFpuw3W5orkVfeRCmXG+ehoAQwNUllwhA1SFzefsIYQWrkVm3dyuV9f09HAw5iMvP6o6X59sYG7/cvEU+BEdYQZiDb9vEnzQWReDYdiOILfkSeDzoyw8AihauQ6592CqxHVoLq5+xhV3u0m7+Reku1OWPZC+0HWBPuC6OmKl2tEHxVrR4G5I2BdKmGpG18oBVwgMLyVUdNpf3YO143FYcZ/tTNi9NvRGyFxmz3Vsc5GLGGbK4N2Fu7XXAFCB/gGNigEkisg6YDbx23P6cSW+GNMITYcatpkXtH4zk3Wo5kz0RFmcGVNVuVt+EEBBqQvrl+RYTW/GguW/VjSblosU7kMu/0pXOpKW7kLkftzSGGbeaYk9IFDL1RmiqgchEM/qH1pr5dfkjN/4M+1/1QHR6dz8Cgk17uy/c7dCTfd1YDiPnWQrGaUDiR8PKH9ggD080oX71QOmu7oNa67vIYapqO6iONjQx14p7FG3uPrZsH5o8Hv79FTP2I+dZfjhARp6xRn3wLXAiki3nc+yS0/oODs4z0iZZZbPONhMQ6cFroO6YLSA9ncYuDgyFUQvg4Nu24A2NQ6oLIe82tOANW2i2NUF1Ibrqv62N6kKISYc5H4N1fzCvVt6t5pZNyIZpNxsfZMSMrl3hsEfFPvTVBwHQ3S8gV98PqZO6xYXA5o+gcCsLG5VmTPm+aG/pqkOPp9MWTkHhsPVJNDYL5n/yotX0tnrQZ9TE08DbIpIKLAc+JCIPqGpPt8aDwB+BTOBd4G/Ha3DYGmgJDIGJK8x97RfQK+XIBw0IRS7/CuoKMAbyxschLBZJmWB5k2BGuqnKXNviQpb8p008W/4Jl33Z8oyTcqC+xPILQ+OQ7EtM9cur/avuDmjqEWpQDyCWtqQK4fG2M0nIRq59CBoqIDLJBPL7IiQaZt3uJWcJMuNWdOQCJDCo/7En+1vFZfUih4i4YMJV6LEdgEL69G5hh+Lt6CsP2O5p3HJ0yvWmoXzkPevPxKvQnc/BpGuRwDA0KQeJGwXudrSj1URa/IO6JncNjECue9iIbv4n/g7q7rgwqk4OuiDi6tJj7wePu1fmAW2NxtietAINijCS5NZ/GXFz1p1oyU4Tq6kv6d1OawMy5QbLZfYLtBRIvGmK026ECVdBQMhJ50W/7+FTOOz7OjEHWfx5tGQPkjoBffE+m1/GLYeZt/VePIGpk2UvhE1/BzCy65r/sc+Ka9CCVUjerQN2QRvK0f1vQUMZkrt02Gl5n6lQiddtvRhYCjysqqXAtj7HbAAmnGybw9ZAg9dIxw48kWjNEXjxuxZrDo2xik8rH0T3r0YrD9Dlas65wsRHZnjzhmuOolv+gcy83XaaYAbDO2EJQJ+6tOIXAHM/bhWn2pqQxV+AhlJvjrMbWfKfaNZsm/jiR/cTI+jVln8gjFtmBBlxQXQ6rnMxSY2YYa7HjmaITkdCos09tu1f3dKDe160cpsLPgO1K4zkE5dl5TR3/BtNmQBrf2txLgSZ8xHLqV76NdMVb6yAIxtOavfvk1/k6GY0dxkyar79fx2cd6h6vOUgQ3pxOgDLv53zcdv5BoUjM29HwmJR/yCkocyMMxjrv+BNWHYvEh6P+gXA2CUWow6LR0YtMBduz7RDL8QvoJcE70WBmEz7zi119jfGCKESFAZjLoWR89Hn7u0Ose150cIPfQy0uPzMeMePMW9c39BYe7MRQBHLYHH5mZdExEJdO/4NYxahh99DgyJwDeTle59CkDMWKlHVGrqZ3GeMYW2gj4uyfCscD6aVXXXImNOhMWh7M5L3YVPDShoPm/9mdZTjR8OoeTa5bPknjJxnu2M44a5OEsfAdY+Ax436+cMzX+lKIdFVP0Vu/IWxzU8CEhBiWrznEOIX0C/+LS4/q2t9zKvrHRBsOeO+spFhsdDRhoTFoZX7kcyZXuMMoGjZPogbaav8wDBk1u2QPsMELMr3obVFSFSKCfkHRRh5yOWHNtcgjRWWpgZW5ScqBVJOeiH6voaIJAH/UtVLLnRftKnG6pUf2WgGNeeyXrs08Q+yBWRGnvE1whPQ2iJ09S8sR98r1ANYjeMQb5hHXDDpOmT8VaYHEObIUPaExGZYqK2pyuq093VD+/l7q+d5s3qCImx8DtRWSBRkzAAsG4TJ18GOZ60QR0QCVBWaOuI7/2Pei2X3oikTrVTu7Dut8l7DOxAUho67sl+5zvctHC3u8w9trTd3Wo9JRNuabJfXE34B6KF30fjRSGA4dDSjYQlIU6UZZzBN6coDliISHoe01KKr/9sml7kfH9gl3QNducptDWjPm9o/uLem9xCGTLrWXNT1JcjkawFBn/+mfSdAFn3eNIyDIsx9HxTRLZGalGO5mKGxJvZSvM124KW70ectTKPih8y+w0IM45ajJTuQccvRlpreHeloOa/f+0LBqzz0JyyF48KjptAKsbQ3wfo/GsmwjziO+Af24k/orheMLFhz2HLtS3ZCaCwyfjni52/ekXf/AAffRiOSkCvuNX6Ig16QqNRBmdYiLph6IxoWC03VyLgru8ICPaHqMbJre5PtjMPi0NBYWPx52zzsfBaJyYR3fmMnuNtNUfDq78KsO2xx5isOtP6xrmIiwwGOFvd5hh7bgb79K6vzvPBuJGE06uk0t3ZDiU0WlQeR5HHozmetBvPIeejIuVB5ECKq+4nqi38QmjgWZn8UfeOHXWlK+uZPTF96IGJGH0hQBCz+PPrWr8DTgSz4zPtmxyCRScjsO7tea8nuXhrlemwHrrGXWm3rYzvMfV9bZBNBWLyR7iISzWOROhncHWhdqS1y/ALMq9DhTdupL4GgCHTXs0jerVY6s6HcUnZis87zN79gcAM3A89cyE6ou8N0BQ6usUVaxT7bRfcVEhn4ZPvb0YK++3vkAz/pLeVac8RIZGApd4fX245xCKO908PeknrqmzsYlRhOasy5Cbdoa6PxYNrqrSTucSRwJTIJmXEClbWSXeiL3zGeQPp0WPR5JCnXCHqN5TDlBjQ8wZuT7hUdGjkf3vtfU/zruwkZWvbsjOBocZ9HaEOFpf14bzLd+xr4B5g79dmvI9Nusphy1myr++rLBz68wXKXtz9l5839BMy4BfJfh6QcSxmJSLYbuKckZR9ZzhNB4kfDNfcD+r6UHuxCeLyt6r1pXzJyjv2NH4XEj7JjksdZGMEv0MoArv6ZhQmKtphnIyIBmflhtK0BCY03opH4ISNmoJseh5gR6KF1MPZyJG0qRCYOrLw2DKGq9UD/WK8XIvIp4FMAGRnn0KhVHTJdAfWYp2T2R1G3G7z/Y22pMz7FAIp2MuFqKxlZd8wIjuF9Qjl+fciBJ6EOdqGxtqCST/xuIx6FmSNj+Nkd00iKOvuuXi1ca9XpwORKV3wPiTj9vG/Nf83mqYhEG4u7/m0E1jqvvsbmvyMZM+DKb6Lr/mBqbREJqDflUsYsRhPGWEpo3m0Q3XvBoHXHoOqQxbYTx7yv5jaBEymJnXcMWwMNHvB4yUxjLwPxoP+6B3wutKoDVvowOsPKPua/aseOmA5lu7ub2fMSrHzQ4m315UhTOUz9gBmlSz5nNZkRZMFnjGF9CpC+Rdffh5CIRFj2TdsFBUf2I7hpe4vJQm78q1Xgik6DaTdZbHnT36G5FioPor4FUUgMLP0qcvV30F0vQfJ4ZOoNtkuPzhiQjX8xwys1+ChAXl7eWZWG0uYaW7gGhtkCtEeOv6LIpV9EQiLR8n3o6z+y3fTieyB9eq8FhcRkwFXfBXebFWXoy9eIH4ksvNvY/8njTTt7iOOf64vweH/t9w7VcKy25ZwYaA6/1/28qdJIYmdgoInPhv2rkWk3mx5BZHJ/UmpHm6Wp5iw1xbYeGSi64c+w7Jvm4QiJ6lWKUxsr0Je/123sF96N5Fx2+n097xBcjoE+TwiLRy79ErrjWcheBLtfsPcbytDD6+ymO7zebs4Fn0WSxwOgUandebsAE65GAsPNLR2eQE+GvI6a271L9DIdhzu0tcGU0TydVhgkLM6MptdwalsjWrTFSkemTjIW6Ht/gdiR0N6Ivv1LOy4mwwQv/AIsnOBDSw2ibivGkZhzWjrqDs4c2lRt/6ujm8xbtPw+E8CoKzaCX+okM85tjeiBNVbisDwffe1h5Mafo+HxUFtkjP+IZCRk8F2x+AdBzmVGwPQPsnjqEER9SwcbD9VwuKKRvFExvLjdClBEhvgTHXpu0r1k9AL0iNdIR48w/sYZtTffctN9egu1RVYtK7EMGkpg4gp0w5+gsRy5/KtoxT6rMT9uuQnJpE2xgiMDheSaa7uNM8CBNfZ/fZ/A2UGfR4jLD0/yBFPaee0hiM1Cpn8I3fx3I2X5BdjqccoHYMNj3pxfzJ09+Xokd6ntHOJGDe5edPnbjvAigbo7rCLRZsuhZNQCWPDp3rmWx3aYUAVenfLl3wYEolMtluZDzRHjAKz+BTLjQ6bpDBCfbSU11ePkO19I1JeYcQYj5B1cgyz/FjRWQnBkVyxUm2uhfJ9VdsucDdmLATHVq9d+aOdO/gBMu/GEHiMJGBppcyU1LbR3uqlr6eSdfZVkxIcxNzuW/WVNPLHuKMU1Ldx9xWh+/dFp1Dd3Ehnsz2Chy8qGNtweJTEy6PQW8BkzTZTEW0f9THXqJTQWybkMT/6rkDjWsie2PAHLvm2a/y21FmeuKECP7USu/zG0NqBh8ci0m8zlPRhrOyQaIlO6c9pHzj2jvp53DKcY9FBK/RgMUn2oO++ydBealGtGJX0q7HwOZt2JtLeacZ5yPeIfDIHhaPEWiEwZEkXbhxTam2Hf692vD66BmR/ulWupPXfD7nZUQS79ohX2yJwNNV4d55RJqKfTcqMjkpFLPgcuf8s+f+E7sOSLaEae6Zt3tJkLHSBmxPBJ6zgFqOri83atpirbYfnkbMHGQ0RSf/dqeX63nGvhu0YKdLdbmdaJK4xPsO1JGLN4UE2CoYLCiiaKqptZvbeCyJAAfrfqEA2txiv55Z3TWFtQxas7y0iJDuZAWROPvLgPVbhhZhpZif1jrdsO13L3X7bQ0u7moQ9N5tJxCadspCUw1BTDzjIkPAmNG42MmGFzXuku8JaJZdxy+3/70rmienPBtLbYQh4RCUhY94JBIhJg2TfMIxYUBgnvLyETgeHh4h5KqR/q6TTyiccDUam9lYX6VmsJCIbc5VYEw90Ou55Hp38QptyEhEZbkXlPp92w7U0XjKDY3uFmdX4FT6wrYt6YOFZOTyU+4vSVwqob22jt8BAfHkhgwBm4iwNCjPm592V7nTQO+uyKZMQ0iyd7Om2Qh8dCyjgkbSqqbqvG1VqPejzw6g/QMZdB5wb00FprwDuR6xuPIDf+Ag2NtmIbviIjcz8OaVMtXtnZiky+3pTQHJwVqM8DEhpn6nr7V1mBk6wBCqbgzY3veX5YvKXo+CqapU+DrHkwxBW/dhXXcfuvN1Db3MHkjCg+PDezyzgD7C9rpLLBGOt5I2N4amNx1/Ty5HvF3D4/k8bWTsKDbUptaO3ga//cQVG1pQN+7k+beeX/LWRE3BDhnaRMMOPf1oAGhps0rw91RTDlhgFry2vlAfT5b1maVvwYdNF/INFpXbFoiU57X3sVh4uLe2ikfqgHCjd0V5Ba8BkYu6TbNZqQbUn4u1+C+FFIYg569D0o2tKdy/dWJSz6D/TNnxoJQ1zIgs+iSTkX7HvtPlbPp/+4GVV4Y3c5iZFBXDPt9PRxC0obuOcvWzlc2cSXr8rhQ3NGEBp0ev928Q+0WrKpk2yBkzy+fz3epFyTK22pMwMd6SV1hUTagic0xtyiT38Z/AJh9Dx4+ftm7JNyjO0dP8rilyK2Ut/8BExcYYXn3Z3o2ke7xFK0dA9c+xAS2kfX3MEpQ1tqjWHvrbesa3+LXP+ILV4HOt5j2vSMWWJjKvdyIwr6yqqCpeZc+U3LnqjYP6RESOqaOzha3UxIgB8b9ldR22yk0u1H6ghZ7CInJYL8kgZcAlMyokmPDWH9gWrK69sYkxzOgfImAFKignl2SwmdHg/3XDGGmLD+i5GhVtnRJy0MQEstOiIPjmyw+W/iikG9h3p0ixlngMoCpHCDVQIcvdDqbr+PcRL1oM87TmumHjKpHy31lgrgY5eu/a2t2H26vUHh6MQVdiMW70AL11nJyIAQr8tUbSXZWGm50WBpJDVHcOVefu767UVjawd1LZ1EhfgTHtx9c9e3dPYa0MdqTl+U47G3C8kvsXSwB57ZQ97IGCZn9J5wqxraqGhoIyo0gJTo48cBJTwOwhcM/rlPrrQPtPowWl6AhERZmkbWHCQiydzX0z9oBUD2vASJ4yBlIpI+3SQg2xotVr3ln2hDGcy83Vv1y4umSlMrC450yGRnCnH1rhbl6eh2cfeB1pdamlxnG5owGpm00khk6kZzl8Gu5+zAccug9hgcfc+KyYTFw5XfPL3a5WcRdc0d/PjFfP7yzhEmpkXw9WvH88MPTWb9gSpGxIUSEuDH/TeMp6nNTUxYILmpEfzy1f18fPFI0qJDaGzrJD48iIa2TlZMTeFzf95CW4eHKyclMzs7jojgAL5/0yTu/vMWmts7+eEtk0mPHRox9r6QkGhY8Gmo6yHXO9ixEUndHhNxWVnZt35hdeIv8P/0TCEXi5LYuUz96AW/AFMc8hnXkGh7rwek6hBastuKmKsb7WyFos2QuwzyX0HSJkNznbl0XC44uNZutnOM0toWfvj8Pp7fVsLSCUl8bWVul9hBdlI407Oi2VxYS2xYIJfknJwE6EDw76NQ1ndRVVLbwlef2M7b+VWMiA3h95/MIzvpxGIrpwKtL7WatS01NrgXfBYZuxh9+fvQXI0s/A90k7eoS/EWSJ+Cij+CLbI8rQ3Q4K3gtedly2F/+9eAwsRrYP2fYfHdgxdwcHBSkOBIuPSLJlrhcSOL7hl0t6tHNkHlftPTBjQuC7ny2+bJmHaTSX2KoP4hSPFWM85gC6r9q5FZd5yvrzUgiqqb+cs7RxibHM7lk5L58K/XExzgxwM3TuS+p3bR4fbw57tm0d7pobXDTUltKwtzEyiva0MFXt1URkNLJx+aM4LfvHGQtg7bJAT4d4+3qZnRPPWFeXR6lKTTJYmdB6gvf32AHPZ+SJsE8++yCmSxGeiBt73ldofmdztVDIsd9FCBBIXBws9ZPm1nm5V6LM83I5Aw1kT6XQHmwvGlWaVOsupR6VMgLAaCIu3c7U9aIYu5n0DDE895/Hn70Tqe2mQpCc9vK+GqqcldBjo1JoRf3jmdktpWosMCyIo/vVD/0apmFubGc0lOPMdqW0iLDmFMUu+28ksaeDvf6skerW7hnX1VZ91A01IHPaU6W+uhbB80e/Mrm/vKeLZC0ji0vADqjiHR6aiPHdpYjsZkIpd8xmpQH9sOlQX9pVsdnBYkMcfKj6qaZvNgUI+xt32oKjTXZ2iMneeLX1Ye6F2DHYaEEElIoB/BAS6WT0nhZy8X4FFobnfzmzcPMn9sPHFhgdz3f7sICfTns5eP5vZfb6CopoW8rBhmjIohwM/F3DGx5I2KYc2+SkbEhnDXpaOIDg3gnX2VxIUHkpsaeUbckXMNba5DC143Rbicy2Hk3BMy6SUkGtKnWQWsLf+A0QuMGBb5/tcncNKszjJUPdDZjoxaYNrOBavQXc/ah2Mvg3mfMKWr0h4xsZJdkPdhq6R0YI2lhWx63IwIoGsfRa7/yTnve9/VdN/bIikq+JSFD6ob2zhQ3kRIoB8Rwf58+o+byS9pINDPxdevzeWPk7Y00AAAIABJREFUbx1ifHokKYHd//bQwN63QGz4OSDzhMXa7tbLxJboNJPs9LKEteYojL8KCt401bHYTHOdvvRdI5uJy3Latz4J45ebSILLD33vfmitg1l3DqpR7ODU0Y9XgE8prNOERlx+kDrRaohv9+a9Zs6C4AEMekwG2lJvpSUL3jS5ynOYfnOkqpmnNxVT09jOzXNGkJtq3+VgeSP5JQ3EhgUyaUQUoxLD+cMnZ7K/rJHgAD+a282VHx7kT6C/kB4Xwt/WHeUb145jw4Fqirxhpo2FNdw4O43JI6II8ncRHuTHwx+aTEu7m7qWDj722/corGwmOMDFox+fQV5mDMGnyfk45yjbDRv+DICW7kbCE+3/egJo8VYo3mov9r2BjF44bFIih5WL+3ymfgyIyoPos18zMQS/QItV+j479A7MuAUJT0THLDbpzsAwk6eLH20Gedm9XaXwuuDyOy+M0ykZUdw2L4PntpawdGISUzO748LVje1U1LcSERJw0hq/RVVNrM6vpL6lkw0HqrhhZnpX7Lnd7WFXUT2Hq1ooKG0kJTqEprZOGlo7GZscxkMfmsTja49wydh4Zo86MyGEgSDhCbD0a0bMC4ow1+f6x5B5n7CUnqh0L+s7yWJgTdXm1fBJp6oH3O3Iyu93r/ATsuH6R+x/HxZ7UrWkHZwetPKA5TS3NSCXfBbNmoMrbiQe/yATlHF3mIt7AB168QswZn/qRMi9AgkI6qU+dTbR0enhpy/t4+lNJjv70o5Snvr8PDrcyp2PbqCivp3b52fS6VEmpUcxJzuOzNhgEiOn8NOXCogI8efLV+Xwxq4yOt3Krz8yjc2FtUSE9DY+IYH+fO5PW3AJfPsDE7hueiox4YFsLKymsNKkhVs7PLxbUIUqTMuIpryhjdBAP5JPwPE4n1BfVTEffLLIjRU2BoOjkKjkAc7sY8SG2K7zdCEyTEhiQwZ1x7prE7vbvWQxARQy56D+wUjxFqtLe+mXICAUXfMrm+znfsJuxIAQe/7WL6CtHpl/lxmKc4zEyGC+vjKXzy3NJiokgJBAI+eU17fy7Sd38fIOy7f84ydnMjYlgo5ODwVlDVQ3tpNf0kBabAjzx8QTERJAQ2sHP391//9n77yj46qu7/+50zVFvfduFVty7+CKCy5gA4bQCS1AIEDgS2gBAiEkBAghBAKhEyD0bmO6Dbg3Wbaai3rvMyNNv78/ropljAEXYvix1/Jao9GbN8+jue/cc84+e/PKepXNXDYrHb9fYtRrBnpjmTFW8hKCabW72VHbxbNfVLGyuImTRsdzxexMFo+Kx3g4I1jfgn61MelzIzsbIH8RsqkE0CAMFqVe1H/stKtUZqw1qL+r0Kq5yqYyZPyIATLY4Yo2/Ixvh/R7lNOUXRHz1PjbQ8oq0hYD7dXIrx6HoFDk9KsQ32BiIrT6o55luX0BdtYNBp2mLjfrd7dj1Gupa3dx68m5PPHZXp74fC+nT0jk7Mkpak05vVw1J5Ner5/bXttBad/GdnpuFGdOTGJlcRPnTEmhuLaLk8bE88JXagIkIOGxT/YwKTOc0no7WiHQawVev0oT0qIsrN/djtPlo7zRQa/Hx0ljEgay+n509Xhp7nZhNem+laR5JCBlQLWXYnIGK1vRORCeqvgiK+9WzwWFwewblKb2PuRBkTgSmTxOmQvlzoOI9KN+zT8Efi5xH2nYYhSTUAbUTTw0QQXY0ASkJQLRVYcs+QBqNiEzjoe2PQN9T7n6nzBiMbL8U8TECxAL7gC/7+B9tyOMIIOOoL4Ss8fvx6DVUtHo4IPtihDV0Oniw+ImMmOsrChq5Jr/bCUg4dKZ6by5qZ4gvZZpudG0drsHgjPAO1sa+PvZMdx16nA2V3aQGx9MUngQFzy+EYCEMBOLRyfQ1ePl2S+qOG5YJLPyj/6mRHbVK+u67gZEzhykLVZlyX7P0OO6G6H8U8TsG5QWdMCHXPcsYvgiRQo8iKPPzzgKGHLT2udxdyPy43sV07unHbnuGZh7y/+MTW816bhidiZX/2crUsJJY+J5bWMdhcmh5CXYqGh0UN+pnNL+u66WhPAg7l9ewaSsCCIsBjJirJQ3DhrglDXY2VjZycSsCAIBGJUSQk17LzVtg1MVcaEmfH5JeaMdq1HHzSflUlJvJzXSjJQwJi2M3zy3FbvLx/DEYDJirEMCdLvDw73vlfLfdbXEhhh58uJxXwvgRxIy4Ieq9Soh0QchZv5WKSuaQxHmMGTlukFRoN4OZO1m9eePyRk4h7DFwIxrlEqc0TZUe+JHjp+EUMkxg6gMxKK7oasB9EHILx8DexNi8iWw5glke6WSm8ua0eeQtA+juf/xrs8hb77Su9UaIGMqIvhAZZ2jg6YuF899WcWaijbOPS6FhP1K2pE2Ix1OD39+t3RAnP+Jz/byq1kZ1Heom43bF2BYnJWyBgcA+QnB7Gyw84+VFQgheGNjHb8/OW/gnHUdLoz6wc9CSvAHJLXtqsSVFG5GcxR6MbL4nQH5SLn+WcT0q5EaLVJrgKgsZTZvi0ZYo5C2KKSzBdY+ORDAZdHrEJ39nQl80ueF5lJkR7Xy6o4e9vMo1veE0Bpg4i+Rn9wHrm5FzutfH1IOMdDA7/2fD/zOHRHDm1dPpq69l3e2NLC6rJWNezt44qKxbKocSkbUa9UacHv99Hj8rN3VxpKxCby2QW12F4+O56PiJho6e7lkRjqbKzuJDTVx/1mFPPl5JWajljMnJfPX98swG3QsHBXHRzsaKWlw4PcHGD0+kc9KWwYET4pru9FqBOUNdvQ6gccXYE+zk9QoCwtHxrKz3s6bm+r43VEM0Nib1d8y4AOPE7nm34iFdw22joxD2xTCZIPeLjWiaotG9GXLwmD+mkjRTwHHWAv6Rx6ghVapfgXHw/qn1CiO3qzmZdsr1TF71yDGnIksXYmYdpXKnH1uxMilyG1vQP4C5Kq/D0hQypYKmHHNUZGTlFKytaqTXU0OQi160iItbK/t4p8f7QZgS1Un7183hbtPG85La2sYlx7G+PQwatp7uGxWBg+urKDV7iExPAivz09Bssr2hYBr5w9j4952jDotbq8fjYALjk+jq8fLU6srMRkGA1NMiJGCxBCunZ+NUScYkRTCJzub+PUzWxAIHjx3JHOGxxz5sRC3c58PIwAhcWiistSPkRlKB9hoA59LMb19HuXl3Z9h22IVeWzXKlU9ico8eMBtKUe+d6s6v9AgFv1JiaH8jO8FEZkOi+9WTHlz2KCZRXCMWlNfPKLm0Cecj9ifsf0DwuP1U1zXTafTQ2KEmc19Adli1BJuMTBvRAxlDXYqGh38YmLSwBRFaX03/75wHNe8sJVIq4H7zyzAZNDy5sY6LEYdS8cm0OZwc9vrOwC4e1k+F0xLpd3hYUddNyX1dho6XXT2ePnltBSig4NIiTRjMeqobh/MtrUagVGnZd69qwkyaLlxUQ5/freUuFATp41PIirYRN7RDM7w9X6xGFw/ga4GaChGTLwQ2bAdItKRQaHwyX1qDepMsOjuQYOgnxgE36zt8b/CjztANxQja7eoMYHUCdBUqspt++/swlNg8kVKLaxwCVgikR2VkFCg/vWLKoAaC/G5lCzoEUZxbTdnPrIOtzeAUa/hlsW5JIYHcfXcLFxeP/6A5I2N9by1uZ7hiSHkJwTz6Cd7eGV9LWaDlruXjcAfCNDV4yXIoKWr10t1m5PoYCMOl49Op4d3tzZy2cx0XlxTzfaabqJsRu4/sxCjXsNTF49Fq9FgC9Jxw4tFlDc5+OXxqbQ7Pby/taGvdya5+eViksKCyEs8suV+UXCyWvg9HWokLiRx8Hf7zWGKsCRk9UY4/tfKE1qjR4w8Ffn+71WmJjSIOTcjY4YNNevYF/bmwccyAM62I/r/+f8J4gAMbaHVIzOPU0Qxre5/rua2qryVS5/chJSQF2/jyYvH0tXrIzbERGqUhe5eL3oNpEdb+KykhVPGJXLC8BisJh21HT0sKIzDYtLx1KpKblyUw6LR8QgE//xoN0vHDcpXJoVbuPTJTXT3+jBoNfxucQ5/eGMn9Z29xIWYsJr0GPrmobNjbVw2K4PdzQ4Wj4rnvuVqNK3X4+edzfWMSlFjWlHBRh5auYvJWUdZZc0WjTjhBuSqh5XxxZRLBrPn0pVQ9AbSaIXQJER0tppb798g+1xq1PEnGqARSgrjWMKPOkDL4reVBZujGVoqEOPPU0pgUVmQebyatc2ajiz/GBGZiexth+1vQd58KPlABWGDTfkUb39TnbRw6ZAyj+ztc+vxe5UmcZ9K2aFgb7NjgLTl9gZoc3oItxp4cGUFoWY9fz9nFBv2tHPm5GSC9FoCUmLQaRifEc763e202l28ur5ugMRyyrgEcuKCeXldDTPzopgzIoZZedH0egNsr1FkmRa7m8YuF+cdl8rOum6u/c9WZuRFU97kYHxGOEa9lvMeXU9GjJVr52dz//JyrCYdzd1u8r7xf3JoEJHpcPJfwedBenqQJSuUTWVcvrLzBKTXpaQmDWakPkiZ1UekKq11R/MgKVAGlONOdyNi+IIDv2FY0iDRTG/+eRTrMCE766C9EmmJQjhbQILsu1mLnjZkIKCU5v5HeHtT/UCFfWe9nTaHB51Wg06rsiKTXsOZk1O4660SXN4AAnjuyyqautz8/uRcnlxVOXCuvS093Pxq8cDPJ49Ro1U767qpbe+lu1eVrT3+AO0OD0adht/MzeL6l4qoaHLyp2UjWFAYR017D6+sr+GmxbnUd/TS0DmYUYdbDTR3uzHqNXQ6PSwaHTdAMDtaEEKDTBqLWPoA0uOEzlqk2wnRmWp9gVp/TSVqzYUm78Pz0fRZ7qKkWztr+o5JRBiOHXb6oeNnP+gji/BURSYacyZy4wvKSen4KxHeXmR0rirfNO5ExBcM9sacrUqEYdRpSm/YGg0JIxAp45SDT3jKQNlUBnzKlKHfESu+AGZdd8A50e+CxAgzWo3AH5BoBMSHmvhoRzNSQofTSyAg+bC4iZJ6O4tHxxNlNbByexNj08M4Z2oKEVbjQHAG2FzZic8vqWhyUNHkIDbURFxoEC19ov79kFJS2erkgRXlVLYq7WGA44dF8tf31Y6+1dFOTryNmXlRLB2bSGN3L3uaHdR3uIgPNWExadnV5CQ4SE9uvA2d9tC2msISgeyohvduBq8LCYphn3k8sqcDufm/iheQNBryFyp/2a465XSVO1c9V7VeZcNGK9RtQ+bPP7CHcGQGYvGfFdEsOOZ/Li95LEPKgGrzeJyqlbBPNUM2lap2kMmmfL13r1Y9SYCkMZA6USlK+dxqfVgPXfnucDAxM5x3tyqrwzCLni1VnTywooLMGCuPXTiGTXs6uOXVYmbnR3PWlGTKGuzkxNo4d0oKw+JtPHB2IQ+uqGB4Ygij00KZmRfFpyUtTM2OJDvOypKxCZw1OZmUSPMQtvbI5BBeuWoSJXXdZMbYKK13cMNLRWTHWjHpNFwyI529zU5eWlvD7xbl8PbmemJDTCwZm0BTl4srwzJ5Z3M92XE2Qs16qlqdpByiONH+kM3lyLptiOhsZGQ6GqMNIYQaR131cN8kBTD5EkT+AmTtVvUdyDgOaY1Q3s8L70J21iPCEiEyQxHNdq9GrnpIvXb8uZC/8IBkMRnwq/vt/7D18V3xk3GzOlYgcuYgNXpkVyMsuBPR045c82/Vg47MgIRCJX6RNFqJ+tcPV4o3Wp0aDek/z2kPK5el/eFRPrgDqC9Su8tDDNAjkkJ48fIJlDbYSQwPIibYyM2vDO7Su3u9lNSrADwszsa97yn/5OXbGrnjlHziQ03MGxHDij6W99KxCaREmkmLsvDGplrCLUaq23p4b2sD1y8YxpqKNkanhpIVa2Xr3g4MWkVM6ejxcMXsDNKjLBh0Gjw+ldXrNBpGJIXw4MoKbl+Sxxn/WEthSijDE4OpaHRQkBzKe1vruf7EHKYOO4wRp94upRbWB9lcjsg8XrUXSlaoJ/d8iUgaq3pgrm7EhPMVS7i3HTH2LKQ5Aul2qPZF7VZkbN4Q3oAM+JS6lduhjFJ+Hsk6OBp3IpffoSoUiaNg2pUIc7hi3i+/ffDvlT1L8QP6Ub8dItLU6M36Z5XJyQ8coKtanWyt6iQlwszD542iqdtNUngQ1zyvPMZ3NTkoq+/mL++VgoD3tjWyraaLu5cNp7nLzb3vl6PTCB48ZyQv/XoiOo1gc2Uni0bFc9H0dNrsLm56uZiRKaEkhAdhNmh56YqJFNd0kRZtITrExGVPbWZvi5PJWRHcf1Yhe1ucNHW5ueiJTei0gj+fXkCL3c1975czKjWUy2dn4HT7+NuKGsoa7Jw9JRmzQcuZ/1xHRrSFpy8ZR0L44ZGwZHuV4mCMWIws/wQ2v4IcfZpKNHq7hpqaVHyKzLxDsfA9TqQ5HE1EmvpdbB4iNk+Rbmu3IK2RsPE/g6/d8B9l47tfdVG2VanxSb8HJpz/g0goHy6Osfj8Iw/Q1ijE6GUDPwd2Lh/UbG7djUgZr3aKoYloYnKQJ94BUipSWD8skd/cbzYEqS9efwadUDDE+/j7Qq/VMDY9nHCrgbW72mnqcvGvC8bwwIpyLCYdQUalAGZ3+fAHhpa6HC4fZ/xzHbcszuX4nChCLQbe3lzHfcvLiQ42cvey4VzxzBZOHpOAUa/l8U/3MCzORkJYEE98tpdzp6YyvzCOunYXaZFmwixG1uxq5/YleSzf1kCb00tmjIWHP9qNPyDZtLeDNqeH8enh/Okd5ff7/rZGblyUw/KihsML0LZoZazQVad6yf3OOfszgDUaxNTLkG4Hcu8aaN+rDvviUcTsG5CfP6haGoA48Q61IetHXRHyg7tUaS46B2Zff8y4KB2LkKUfDrYPareo/r05/GubKbobIWGUmoEFSBoFrbsgJk+VQI1HWCb2W9DS7eLKZ7ZQ3Df/fPmsdDJjrDhdPhxuVYa2mZQZzaJR8YSY9WojXGenpdvNI58o/3JfQPLQyl1cOiMdvU7w62eVUpZJr+HBs0cyJTuS4touXllfS6TNwJMXj+Oc41IBeOGrKva2KALkVxVtjM8I528rKlhQGMc9pw+nscuNXiu4fkE2m/Z2sHBkPEatllV7W9nRd91Pr67ijqUqSdjd7KS+03XYAZreLrXWnG2qKgXID8oQS+5X1ZDQJFWmBkgZj8ZoVkp+fF3ZULbuRr5zs+pDZ05X67dfqjc49mviTtLtUOuzTX2+8sN74OR7/+c8hYNCHH4GLYR4AsgD3pNS3nWQ4/4JLJdSvnOw8/2oA/T+EIgh3rSYQpRLS7Sa4Rtg/I45ExmapDKzYbO/8cYtNDpVUo0epnaBUVmHVN6ubnXySYkqZc/IjWZbdScPrCinzeEh3GLglpNzeXtzPde9UMR9ZxWytaqTEYnBLBgZy/JtjYxND8PpUg5Xd75Vwh9Oyae61cmKIrUZae52oxECtzfAf9fWcMbEJOaOiMFi0PHgBxXUd7oYlRpGmMXAWVOSCbXoufzpLfgDkqTwIP542giklNjdXiZnRWDUaclLCMag09DVZ8HXj16vn1Eph7fIhC0G5t4K3XWqGtEvdBCVqdyPdn0OSWOQwXGIms2KPBbY5zqkVGNz+4z4yO5GxD4BWpZ/Ovj75lJV5v45QH8zItIHbuLojIoDYG9B7vocMo6H3atAq0fkzlMCQLOuB3sL0t4Ijhak0YaYe/NBnZCOBjp7vAPBGeCz0hY0GqUIde8ZBXxZ0cqCkXFc85+t9Hr8XL9gGG0OD9Nyowgz6wk16wdsJhPCTFhMOsoa7IzPCO/jc/gx6DUkR5p5enUlAK12D6vLWhneR6IM3k9pzNhHEFu3u41wq4EPtjdy25I8nl5VxXULsnnuiyp2tzg4d+rQlotOI1g2IZEPi5uOjIZ3cIxqA/Z0Dj7n9yp55LAkOOFGZHMpwmAZMud8QLRXq+AMsOtzxII/ICtTlOhT/gKl0b0vAj41ldEPV/cxr5cvODySmBBiKaCVUk4SQjwphMiSUlYc4LjjgNhvC87wEwrQMuBXhK7jf43w9IAlAhmWgiYs8WvHiuBY1YP+DhDmUEgZ972vp9fj65tLljz4wS4+L20B4MPiJhaPjqfN4SHUrOf2pXn0ePycNj6RYbEWtMCikbH8+pktXDAtjem5UbTaPfz5XVXuTo+2UN5gJy16sEclBNh7vdxyUi5/fLuE97Y28MfThvPxjuYBYQaTXmXnpfV2kiPN+AOSCKuB845L5cJ/b8Drl1w6I42yBjvbqruobe/hyYvG4nD5CbcYaHd6yIyxMCY1jLyEw8+SREgs7CcjKMxhMOECGHkaUgjY/DKy9AM1wjPzOmR3E/R2IApPQbrsEBSisgRrNKJvXGsAMcNgz2r12GD5wTO7HxtExlSkRgsdVYismYiwZOW1XbICUicgxvxCranyTxDpkyF7BvR2q7VmDlXWrm4HNJYgAxIZEofQ6b9+4z7CCLcamJQZTmasjUirgbFpYTz6yR5cXj9Xzw2n0+mhpN5OUriZU8cncv9ytTEGJfjz4hUTeGV9LQBhZgP//mwPZ09NobTBQI/bR3FdN8u3NXLT4qEBLHIfzfr0KAsXTUtj7e425hXEsrpMuevNHh7DnmYHl85Mp7nbzWWz0mntdrOluj9wCWbmRVNU08niUfF8UNzI/IJYTp+QRFrU4PputbtYu0v5UE/JjmRY3Hf7LgtbjJI27qpHNu1UlZD8hYNKidYohLtbBVK3Q62nb8K+bQshQGtAM/mibz7eFIKYfEmfkE0AMeVXypzoGMdhZtDTgZf7Hq8EpgJDArQQQg88DrwvhDhJSvnWwU74kwnQQqNFJo+BjS8iazcDAjHjagL2JoQMQFgKIvjQGdjfB1JKVhQ18tyX1UwbFsmWqg7iQ03kxAfT3O0iOljtju88NZ+bXi7G7vKh1QieuGgMZoOGxi4PDV1ubnt9J+cfl8ro1FBuW5KH0+1Dp9Vw73tljE4J5e7ThrO72cGM3Cicbj/tDje/mZOFxx/g96/t4KbFuVQ0OZgzPIaYECPPf1lNSqSZYXFW4kJNjE4N4+V1NQNkl399uper52axrbqLsgY7O+q6cXn93HlKHi5fgJw4G3UdvWyr7qIgKfSoGGsIvUm1HJrLVXAGcHUrxvewWRCbj9z2OnTWKHKZRoesL0LWbAK9CdHH1BbpU8BoVZl18lhl0AHI7gaVUVgiDouR/1ODsEQghi8c+qQpWG1sKtcphakpv0JMvACCYxEaHdJoVkz64rchoRDp6YGvHkNM/CWsfRzp6YXjLofEUUdsvtTh8rGryY4QgqwYKxFWIzctzuXq57eyu9nJ5MxwsuOCeXp1JVc9t5VHzx9NY7eL8vAgXF7/QHAG2FzZwYLCWGpaexmVGoKUgln5Mfzmua0D3ZYbF+XgcDVjNmj4yxkjeH1DHcPibZj7dAX2NDs4918biLQZSI4wk5+oKmynjEvk4x1NTM6O5P7l5TjdyozjntNHDLz/Pz7cxTOXjuXD7Sa+qmijtMHOxIyIr5E8X9tQN7BBj7QZeO2qySRFfLfytwiOVSXoJfcrEp81anAssaFYGdIgwRIFC/6gJHkB2bYXWbtVcTfiRqjq4fw7kG171PjVt4xaCSGQKeMQpz6oKl5935ljHd/yNY0UQmzc5+fH+qyV+2EB+iUd24HRBzjHucBO4C/AlUKIZCnlQ9/0hsf+J3YQyN4uJUii0SEtkQi/ry84A0gl82mOgLh88LkVK/EHUJLqcLjp6vESatbjC0juPCWfiiYnq0pbmJgRQYhJxx9OyafH7R9QGfIHJEU1XeTFB/PS2mp+tyiHFdsaiQkx0u70EB1soNejpaatl+sXDMPrC5AWZSYl0swH25sIM+vJirVxzX8UMUYjIMig4foTs/mirIU73qgkNEjPr0/I5IPtDVw+O4Ok8CCeWlVJeaNSIAs163H7AuQnBHPpzHTW7mrjhTU13HlKPh9sb2TZhCSue7EIjy/AlXMy+fUJmQNqTEccOqNi1fcbZhitivDnbIfQBLBFI7VGWP+0mn8HZP12mH0DwmhR2XjW9CG9NNlejXz/NmV9GRynCDGhCV9765+hIEITkAvuBEer8lkP+BRvwGQFXTi07EJ++CcAJQQ06WJk0hhFSOoX/vnwHqXdfQT07d1ePy98VcU9fcHq9iV5/GJyMkU1Xexu7usB72pnfKZqZXT2eNle20Vjl4t3tzQggONzIllV2ooQcPaUFH77wjbOmZrK6rJWYkNMjEoJHUKF6HH7GJkSymkPrSM10swtJ+fSanfT2K2CaFOXi3anh3anh/JGB5E2I2t2tREdbGThyDiC9NqB4AyqjH3ZzHQ+LWlh6bgE4kKCGBZvIzXKgtvrZ2t1J2PTBzNNKSVflg/O77faPXT0eL5zgO6HOMCIoazZBP1NQWeLmnAJiUN2Nah14upWv514IZoRiyCxEJFYiGyuUPa9wfEQl6dK5Ad6T40WQr9ewTxWIb69B90qpRx7kN87gP55MytwoJvjKFRgbxRCPA/8EfjpBWjp6UXuXK4k57y9yjPY2aZ2/f0s0+hs6KxDbnsVJl2E8PuUW9VRRmVbL3e+VYKU8FlJCw+dO5J/fLgLUD7QqVFmwi16THrdEEOLtCgLj366hzMmJqGRML8wlltfU+pFsSFG/nJGAQ2dbu7pI23duHAY//68cmDHffqERH49O4PPSltYNCqerh4vTref/KRQJMpC7/9eKiItysLJoxNwun1cNScLi1FHV4+Xc6emEBykR6uBW1/bwbA4G1fPy6Kh08X6PR3Udbg4eUw8L6+r5a1N9Zx/XCphlqOkwxuaiDjhRuSWl5VqmClYeUNnHI/c/pbSAbZFQ+uewde07VVZgvHANwzZumvQl7q7QWkO/xygvxHSbVeucMXvQEQ6Ir4AufklGL5IWXz2WbQOIKAEZIavOZ1PAAAgAElEQVT0GgN+cNuBww/QbQ4PD3wwWDF8cGUFcwtisZp06LUCX0AipeoBCwGXz86gpN5OoI9w+c6WBpZNSOTeXxTg8QZIizQzZ0Qs9y0vH+BaFCQHkxVjpaLJQZhFz6jUMM5/bAMAla09PPtFFSePSWDucLUJiA0NItJmYGxaOPGhJqYNi2JqdgRevyQnzoZWqyHcYiA21MT8gliiQ9QxM/Oj8foDPPrJHl7fqJKu3y/J4+zJyQO9bVCZ6OkTk/iiXJXNx6WFEh96ZESURGwusl+kyWBR5hig1pB3cF6bhu0wYhHQzwy/RSU8oPTyj6J96A+Lw56D3oQqa68FCoGyAxyzC+gvP4wFqg52wh9tgMbVpfpea54ApPKpnXoZTLtKZVLhadBdDzoDYuRpSHM4Qv/DWBLae71DduE+v+T/FiiJydQoC+1ON812D1urmnjonFHsbnaQGBbE9ppu8uODMeo0PPLxHhLDB4f/G7vcaDWCT3Y2Y9BqSAgPwhuQQ8phO+vs3HJyAqUNdqpae9jd7GDdbsW0fPi8UVzxzBZAkcre2FTPgpGxffrEEluQjma7mzaHh398qKRH1+9upzA5hOxYGx5fgDaHm/gQE1fPyyI10nzEnV+k2wENO5AdNYiEAmRwnCK5xA1XGt6TL0G27h68eTjbIWfOoBJcwRKkzwWV61U/LTJ9iIOSCArdj0R4lGUVf+xoq4Qtr6jHjTuR0dnqRl61DkaeCmEpagrC2ao+79g8ZZ6QaVXyn95exOgzkL0d31k//WAI0mvJjLYOMJ+zYmwEGbTEh5i4dn42Oo2GqGADOXE20qMsPPrJbs6bmoItyMBnpS20OTy4fQE+2dHMzPxo4sPMJEeYhxAhX1xTw7lTU4gJMZIRbSUg5ZCZ55AgPR6vn65eH4moTfUTF43lz++W8VVFK2ajdoA0JpEUJofy0DkjqWpTwidSwg0Lh/HWpnrmFcYOBGeAl9fV8MqVkzDptextdvDWFmWbuXBkHK9eOYkejw+zUcfTq6tIjjAzPSeK6O/pGT8EiSMR825DOlsRkZlgCkaWf4xsKlPVkO1vQlcDInvW4Gt6OlQA74Ns3X1U/b1/SKg56MM6xZvAaiFEPDAfOEMIcZeU8pZ9jnkCeFIIcQagB0492Al/vAFab0bamxko0fR2KtejD++BxNGqJNc3HiVrNiFOuvcHu7Qom5GCpBCKaroIs+iJCTFy0yvFXDYrg5tf2U6H04tGqB3ztS9s5cSCWLQCCpJCqGx1sqO2m5q2HpaOTWBl38xzfJgJk17LjLwoFo2OZ1tVJ3GhJhaPjuftzfUIodx7unt9fLSjmavnZfHCmuqBa2rodA25xl6Pn0irkXCrG61Gw7jUMAxazYBEYT+MOi2BQACNgDtPHY5WwLX/KcLjD3DT4hzOmpw84Mh12KjbpkglgCyNgpm/VSXV8o9VFp0wUrGI3Q4wBCGMFmRLBWLC+RCVrZjaDTtUv7RmE2L+bZA4cvD80cMQ036DrNmsbiqRx/5c5rGFvrtXxvFKJjIoBBbcqcZtzGGIkHgliNFcDhnHgVaPLPkAMfPaQ35Hrz9Am92DSa9BAlfPy2Ll9iaCDFoWjYqjrKGbG17aPuDDfN7UFEalhDIs3sbo1DC8fslVz23hnCkpWE06xqaFIYHhiSFYjDrGpoVy5uRkXviqGp1GML8gjvuWlxOQkvvOLGRlURMPnDWSf368m7hQEzPyotm4p4OoYBP9yglfVbTxVYUqQ//jw91cd2I2f32/nCcvHsvpD61lXkEsK4oaBzbtD35QwS+PT8Pe6yMu1DSwNkclh2LSa+nq8XDDf7ezca+q9qypaOPxX46l3elhyYNfDWwoblg4jEtnZhzyZysMFkgaNbB5knu+RH6uqq1SfISYeysYzRC+T785OAas0Up1TGgRCSO/fuIfMQ7HJEhK2S2EmA6cAPxFStkIbNvvGDvw3RjK/IgDtAgKhuiswYxIHwQIRTDy2FW5sx9eZb4gA/6j3oNu7Ozl189sZmpfGWtYrI3i2m56PX4CAUmHUy2ugIQ9zU4iLAamDIuisdPFc19WMikzkkmZEfgDknanh5sW5yAljEwJYXtNl+oPP7kZX0Dy1uZ6/n7OSLJirAxPCkYD1He6+NXMdFweP1mxVir6+stSSi6flcFjn6rMfMnYBHY1ObjuhSJAlf/uWTaCxi4XF01L4/mvqhgWZ8Oo0+CXsPz/jsPj8XP9S9vx+FVJ/u63S5mZF0169KHPhu8L2f83C0lQIjSrH1HawaOWIbe9jghLVGIHs6+Hqg3Ij/4CQiDzF8JnfxuQKhRTfoU0WZE1GxH7BGhhtED2DET2jCNyvT95RKTBqNNViTsqU82rx+UrwlBfZaLf53v/14mAF9lRi5hxtRINOgS4vH7e3lzPn94pJTnczE0n5XDJk5tIjbRww4JsXllfy4jEkIHgDEpd7+wpkowYK2dNSub5r6pxuv082jfv/K8LRjM5O5LNlR1UtfaQEBZEZrSFxy8cQ1VrD89/WUVnj5eIPq2CVzbU8tHOJp66eCyf7Wzhyc/30mJ3c+G01IH33H98v//n6rYeWh0eOnq8xIcFkR5jZe6IGJxuH2lRFu55t5Q/LRvOF+VtRFgNzM6PRqsR9Hj8lNYPKgaW1Nlxenx09XqHZPsb9nRw6cxD+mgPCNlZv88PARAgooeay4jgODjxduiqV1WTvhFJ2dUALeXKUCNm2FFn7x8ViMN3s5JSdjDI5D5s/CgCtAz4lUJRwA8hcQPi7tIaq5xXPA6EwapKLz4PtFcjxp+LrNumiC2Jo5F7vlRCF9mzBsXhjwK6erxUtvVS+ZXKXguTQrhkpvoSG3QazAYtPR5FGhmVEsq8gljufHMn5x6XzEXT01m/u52r/7OVW07K5bd9wRPgyjmZPPrxbq6dn41vHxGTDXs6WF7UwNlTUlhb0crFM9Jp6XaTHGGmMDmEsgYH8WFBbNzbTkmdnUtnpjMuPZyVRY1k7Teu4XD7cPsCHDcsAoNeQ01bD39fWcFD547CqNPyny+q1Xxmn9xocJAOo+7IbXhE0ihk0ZuIrBlKgUgGoKMKGZsHs65H7vkCufm/iPyFyMTRiFP+Bghw25GOQWMMWbcVkTwefqCWxk8F0m2HjjrQ6tTUg9GKTJ+s/g6dtcgvHoXJFyHaq5BRGd9MDtLqITYfEXsAdb7vgd1NDn733+0AbO/p4uW1NYxICsGo02Ax6fhgeyOBAIxPD2P9HpVtHjcskr++X8ZvT8ymqdPF8TlRrC5rpaLJQaTVQEa0lQ172vllnzd6kEHLlSdkct0LRTxwtpqjTwwP4pbFudz4inrvDqeXug4Xs0bEUJASSkqEmbR9NqVzC2L4rKSZHXXdnDYuiW3VnViM2oFe8YoiNaZl1Gm45VXFKQkO0vHI+aO57oUiJGozEmTQkhFjI8Ki585T8wcIn5fPziDCYkCnEUzJiuDLijY0As6anHxYn+/+EEkjkUWvqYQmLBlpiz1ga0KExA/RtZc9Hary1SdKwujTYfQZx5wz1LfhZzerQ0V1X7YkAzDuXBh+IkJnQkQkg7MZajYhEwohJgcx41qksxkZlYk46S/QUYOsL4Kd76tzRWYecChfOlqUH7FGB1HZav75EBCQcPvSPGraenl6dSWXzkzHYtJxz+kjqGlz8uA5I6lp6yEq2IjHF8AfkFw0PRWPD658dgsWo45r52XT0j101MKk13LZrAziQkxkx1opb3RgNmjJjLGSFB5EepSF3DibytCF8ohud3p44vM93LYkn9c21LFsQiJ6rYbmbhfzC2MJMmiJtBlotXuIDjYSHKTjrrdKSI8yc/vSfGJCVAldKwTFNZ0891UVNyzMwaTXYHf5uHpuFgnhR3CzE52jtLNdnfuIkAiEJRxZt1VlcoCs3YI4+a+IiFRkZ53awJnDVH8MZcohPQ5E2oQjd20/cUhPD3LzK1D8Nv0jimROg8YdsLWvD50wEnrakeufg4KTvz6WdZSh12m4eHoaL6+r5cU1NdxyUh4fFTdx6cx05ozowReQrKloZWZeDOc+uoEWu5tfzUznzElJWE2q1ZQeY+X9bQ0D5+z1+PH4A3T1etFrNbx21WQCSNodHrR96VROvI1dTQ5yE4LJz/36rHBalJW/nFHAlqpOunu9zC2I4fLZGaRGKunRL8tbyYq18emOpoHXdPf6sLt8NHS5CDJouXBaGjqNYNPeDh75aBcRNiOvXjkRhHLEMui1ROm13PuLAvY0O7EF6cg5gtaUUkpkeCpi9o3QXKaMNOq3I62RQ3gcB4TXNWjvC1C5DkacrJQYf2T4WYv7e0K6HeqGoNEhCpcqpmhbJTJ6GEJnhPQpkDZZzd0525Hb30ZkTEFufwvp9yGGzYbdqwdPGPAf+D2+elyZMACMOAnGno3QfcsXcz/sqOvizIfXYXf5yI6x8uqVk9hc2cGdb5Vw4fGpjE4No8ftY0xaGO9va+TtzfU0drl4+pJxXPj4RnwBicvr4YU11Zw2PpFLZqTz+oZaxqWHMy4tjBa7G6fLxx9OyWd3s5NwiwEpJXNGxKIRgtqOXu58U+nr6rWCe39RwJKxCeg0gjtPyeepVZVUNDlYMiaeqGATNW09PHj2SDqcHoRG8Nv+ES2Nhtr2Xt7dXE9atIUgg5axqWFICX9+t5RRKaH8dn42E/rGWRo6e9le04VOq6EwKYSIQ1RBEhotRGWoedpRpymCkjUSGQgoIlI/Aj5wNBNwtMCXjynC4IxrVNlNq0PW70CMOu0bM7yfcQD0dPQFZ9RnXr8DkschzBGKrTv2TCVcsvm/igfQsAOZPesbXYxkX1sJnVH1qg8BGdEW7jw1n3veKSUx3Mz5x6Vy/mMbaO7bvLY53JwxMZmbXilmyZgEHv1kDycWxtLY1Ys/IPEHJA9/tJvfzs8iIdxMpM1Ir8fH5KwIPP4AOq2GrVVqU5efoGRxO3o8mI06smJt3LQol+r2HtocHh78oIJx6eGkHsDEQkrJS2trBsroaVEWThuXSIfDS0qkGW8gHKfLy4TMCJ7+ogoplSd7UngQ+Qk2ThqTwGOf7hnwel82IYn7l5fT6/Vz8+IcrKbB+1C3y4fT7cMWpDtiwUR2NyC3vgpdDcoko2SF4hVodIrD8Q16AdLRqvgeOgPMuxW+fFwRczOnHRW73h8Ch1viPtI45gM0Wj2kTkKYQ5FFb6ob9dZXEQvuUmpR7FOW6OmAoGD1pWndpUYBWirUzb74XcTki1TPsqdjqCas2wlVGwZ/3vOF8o3Wfb8sek1F28Bcc3mTg9r2Ht7aVM+JhTHkJYbw7tYG8hKDKa7t5vWNdVw6M53nv6xGg0DXNyYCqhSeGx+Mz9/J/JFxZERZWFXWwuqyVrZVq9GWW07K5ZblxbQ5PFw7P5tWh3tI1u31SwJSzU3+4c0SLpqeRkWT6ke/samea+ZlsbyokWFxNixGLV6/HGCqLh2bwC2vFhOQsGFvBxdNT2NbdSe/WziMd7c2MC0niuy+8nhXj5ffv1rMxzuVUtrls9K5am4WhsMofQuDGQqWKs1fnUHd6H1uZM0WJTeYOApZvRGROArpVO8rP75XCWmYbJAZDs3lBIxWNPv0R6XfqzZ6x9gu+dvwXfV9Dwt6k2JkhyUrEYr6IuTOFZAxFWZcg2zYqTS6AbnxP4r49Q0tBOm2K/erojfVNMXMaw9p3txk0LFsfBIz86Ix6bTY3d4hQiOt3R66erw0dbmpbO3h7+eMpLzRwdpdbZw9JZnVZa1sqepkTFoYNW29ePx+9rY6SQg18czqKuwuH9fMy2JKViQnjY7n6dWVPLO6irhQE09ePA6TQcPfVqixrgirgZjgA/9/ezz+AaVAgL0tTuLDTVz4xEbCLHqumZfNXW+VcPPiHP594Rh63H7iwoKwmfQ8fN4YVpW10GpX/6/a9l4CfU3shg4X3T0+Yvr2NxWNds74x1o6e7zotYIXr5jI6NTDV+eSRW9C2cfqccsuxMhTkJteVNK4B8meZemHiKAQJVTjdqh2Y1AoIiLlR7fGoG8O+hiL0Md0gJaeHuTuL6Bhuyphx+aqbNjvRTbuRMQMJTAQFALxIxE6HTImG2GJVPaF1mhluvD5g2pEJ3G0kgTtt9QzmpVtXk2fSEzqJOUf/B3h8fqp73QNmU/UCAgx61k2MRGPL0CL3c2HxU0sL2rkslmKNHPve2X8adlw7C4P95w+gnvfK8dm0nHt/GzqO3p59stqatt7uXpeFjqtZiA4g5IMzY61sXZ3G0nhQWp+WQgMWg0ef4BwiwGzXktyhJnuXi9m49CA2S8wYnd7SQg38chHe7hxUQ6flbQQaTMSkDA7P5qUSAvBJh0hQXrMRg0vXj4Byz47+tr2noHgDPDW5gYumJZGhPXwetPCEASGvpu6NQqpMyJm/RZa9yC76pW5fES6Urpy25WcICA3vgCdNYo86FwCE85T3rVV69X8dEwOjFj8P7NE/L74rvq+h/0+lgiYdwu0VSE/e0A92VyOsEUhW6uVsEvWDKjeqD5vc/iBLT4B2qtg2+vqcdtu5J4vh5jafB/odRriQlWWbjZqufWkXG5/YydajeC6BcNIjTITaTPwYXETY1JDB/QGNu7t4Pcn53HVnEz+8eFuvqpQ6+TCaWkE6Qd5IA+sqEAjBGPSwnhmtRpJbeh08er6Gq6Zl81zl42ntdtNTrxtSN95X1iMOk6fmMTtrysDkSlZEXxaotZEh9PLh8VNFCSFsKqslYKkEFKjLGyp7MDnl8SGmojaL/BbDDoMOg0LR8Xx2sZafrdIGVhUt/UM6IZ7/ZLtNV2HHaBlwA/dg6V3/B5lkpIyHjHmF18zt5AyoLQHnK0Qlaky735Rms/+hjj1oQFv9x8jjrH4fGwHaFp3wRf/VI+byxDjz1e+s6DE3vsgHS3I6o2gNSJMFjWbFxyH3PEe4rgrkOWfIA1Bg/OztZtVObQvQAujDaZeCs0zlJBJ9LADepseCG6vn9c21HHra8UsHBnHnafms72mi6VjE1hd1srDH6mZ4pRIM2dPSeHp1ZXUtvcQatYTG2zE7vLxwpoaOpwefjM3k11NDmraenhxTQ0zcqN47stqjDoN9l4fMSFGmrpUllyYHMqGPW3ce0YBm/e28+bmBn47P5vHLhyD3eUlO9ZGbKiJOQWx+P0BVpe3Mr8wlh213ZwxMYmMGAvDE21Myojg85JmzpqSjNsX4PLZ6Zh0Wp66eCx7WpzoNIK4EBPLixrJirVR3dZDZowNfd84VofTw5jUsL55apieE4XNdOS/ViI0Ednbhdz0EiD7VMa8qiri94ElHOn3DbrzgJIy9HmgvRL5yX3qdS0VyoQj/8Qjfo1HCdM5iL6vEOIS4BKA5OTDJA0ZbeBxDH2uqw4Rn4vc8Dz4XIgxZ6jydb8V4YEg9tucfVsP87tenl7LsgmJjM8IR0qobHVSVN3FkxeNxSclm/qIYv0IMmgoa7APjEDVtPfS2OViZ103WTFWShvsGPUa/AFJ435jiKFmA2ajjilZkVS2Ommze6jr6CUh7MAl/SVjE8iKtdHh9GDSafjVU5sHfmc16eh0eilICiHYpOOdzXUYdVre29YIwNVzM7lxUQ5bqjqZlR+NzaTjT8uG0+H00tXrxddXjo8NMQ2xh82KPfzpCaHRwuhlyKZSVZ0qWIpMm6xMhA6UBbdUKFergE85/e1jWKMey6+/5kcCcfhCJUccx3aA9vQO+VHqTTDmbEREyoAtmgz4lTZz2ceIcWcj1z6pntcaEKNPV1+6wlOhpRQqPoP+5x0tyIZiNT6iM6mM6hCyqtr2Xm59TQkQvLOlAaNew1mTknG6fawuH+ybVrWqoGzSa5iYGcEX5a08fN4oVpe1YjXpmJ0fw2vr6zhlfAJhFgO/mZuJxahjWk4UHn8Aq1FLfmIwe1ucJIabGZ0aykXT06hscXDdi4rtffsbO/nl8amMSw/HqNNQ3uAYCNatdg/RNiO/OC2fh1fu4pX1Hm5fmsf1LxZx56n5FFV3EWE10OvxY9BqueONnVS29qDXCm4+KZd3tjTgC9TT3eslP8HJnBGx6HUaNBrB+Ixwjs+JRK/VMCY19LDK2wdFVDZi4V3K8tAahRRCGcr37fJlV70iMtUpq0CROw+hMyC9bobcOHo6DnDyYxYH1fft0wJ+DGDs2LGHd3dsLEX2dKjg27ZXqaxZo1W5s48EJNc/B0sfUG2Ib0J4Kkz8JRS9AZGZR1TIwmRQ5KgHV5Tz4EqVLZ8yNoGLpqcxLj2M+FAT9Z0uzpyUhISvzfVbTTo8vgAnFsawbEISyZFB/OmtUv56ZiH3nVnAIx/vISfexvE5kbR0u2npdnHra8VsqeoiO8bKvy4cQ8oB+tA2k55JfZwMh8vLw+eP5q/vlZHQ11Pu6vFi0An+/dlepmZH8uTnlQOvfezTvTz7q3HsrO/GoBV8VNzMqxuUgcddp+bj8vowoSMvIZiXrpjAzjo7qVFmRqccmVEmEZsHS+9XEzC2qINyN2Rb1aD8btV6xAm/Q65+GNxOxPG/VnoFP2L8HKC/DyLSlNVjcxkExyHiR3y9l+X3QGOpUsHpqBn6vBDI9kqEOQLSpiB9XjDakFtfVqIWgDjhJkgdf8iXqNMKjDoNLm8Aq1HHqJQwTvn7GmJDTJw+MYmivrL0mNQwRqaE8Oyl46hu6+XMScnsae7hkY8VsWRVaSt3nZpPV4+X/3tpO1E2I4/9cgyTsg7uu1zf0YsQg7OXJoOWP71TwvnHpfKHN0vQCDXO9cdlI4gJNnDF01sG+uR3vVnCOVOSkRL+u64Gjy/ADQtz2N3sHJgt9folO+u6iQ4xUt/hoqa9l09LWhieFEJKpIXC5FBa7R4+2N7IrLxohh1BZun+EDq9msONU+M7+y8lTUg8ctqVqsSqNw3aWIYlqd3+ni8gKAyRMeWoXeNRwHfR9z0yCHhh62uQcwIidSIyNBFZu3XQJ9poRYw8DVrKka5uiMo4oAGCMARB/olKrERvOuJjjS6vf6CEPC0nkhn50dz7fjlRNgP3nVlIV6+X97c28OwXVZw7JYUHzyrg359XUZAcgkYICpJCqG7v5a3NdUzLieK+swoH5DVz42y0Odxsr+nmsqc30+H0cvmsDHo8Acoa7FQ0Og4YoPeF1aTnhOExDIuzcfvrO/jl4xvIjrWRnxCs5rQnJ3P1vEw27e1kZXET03OjqGiwc+6UFGwmHb95flDb4unVVYQE6flqVxuXzcxgZEoYIw/T7vVAOJBW9/6QPg8iIm1wqysDSsHx5L+qoG0O/0G8Do4axLeaZfzgOOQA/UMQV4QtGk74nVIJM9qUs8r+x+iDYMQi5Kp/qLEboQXpV2YKthjY+AIkjFL95oypULMFmT1TRbQtLyNrNyEOI0AnR5h5/MKx3PVWCePTw/ispJmAVIIh63e3c/9ZhVS39eB0+3h9Qz2XzEjD6faxoqiR+YVD7RbNBh33vFPK1XOzCLfqCQQkjZ29hJgNBBkO/MXPjQ/mkfNH88zqSgqTQsiOtXLWlBSsJj2/PzmXzh4vVpMOl8dHhM1IqEU/EKDToi1MyIigq9dLd4+PWfnRvLimmhML4zDp1aYD1JhHf3VgXHoYaypaB3rYFqOOxaPjWTz62xf4DwFhifia77Mwh8LkS2DUqaC3IGw/jv5zH76Lvu+RQUyukussXYlMm6wkVnPnIYbNQn7wR0ThUqWN7nGC0KhqRmzeAU8lNDo1+nYUYNJrWTYhiaKaLs6YmMz1LxbhcKvvtC1Ih16r4e0tapTq5leLue/MQm45OYdWu4fmbhcur79P9CeEp1ZVsmFPB3cvG862mk7e2drA1OxI3tlST32HKns/sKKcq+ZmUdZgJ8Ssp9XuxmrUYfqGNdmPULMerUYgJZQ12DlnSgp5CTYk8NSqKmJDTDx6wWjK6u2YjTo+2tHMuVNTBqoAoJjsH2xvJC3aygfbG7lw+sFdpL4LpJTqnqrVDzpbHex4Tw9y9yoo/UhxdRb9CTpqEOEpEJH6zVyEHxmU1OexFaEPKUD/UMQV6PMI/raFnj4FEZKglMIW/RGc7Uh7E3z6AGTPhIhUpNeFXPeMEv8HdWNJn4KILzy86xOCKdmRvHLlJHRawXNfVPFhsRLN2F7bxcSsiAEm6O+X5PHqhloibUZ+MzcTq1E/MIecnxBMZLCRK07IpKSum+5eI/cvryA33sbiMfFMzIg44M5dr9MwZ0Qs03KiWFXawlXPb8XtDXDVnEz+u65moGd93YnZfLKjmWvmZfPvT/cwLj2MMIuRX/xzHYnhQdy6JJeNeztweQM8taqSGxflsrvZwZjUMBLDTfz9nJG0Ozy8s6Wev509kvhv6MUdSQQ66xDtlaAzKi/ozlpE5nGKdaozIYYvVNZ3+0A6WsDepDykwwZ7siIoGIJ+lNrb++v7TjxabySCY+CEG6CnE1m5Bt69WfWlT7xdicI0l6vgDCADyNa9qjxK/1OKePVDZFGz8qLIuWoSMiAHgjNAm8OLfh+mj5SKXAWStbvaeXldLb+dn01hcgh/fb8cgDW72vispIX8hGCEgICUAzPQoG7a8SFBPHzeKEoburnquS1MzY7kmnnZQ9ZBq93F+9sa2VLZydJxCUzKjOC2JXlMz42i0+mls8dDWpSFq57bij8gqevo5aW1NSwdm0Bli5OUSDMxISbuOCWf1aWt6HVKeveRj3dz9dws2p2DKmKHChnwQ/Um5JePKlLttN8gIlIP/qLW3fDFo32PdymWdu6cw76WYxGaY2yvcagZ9HR+KOLKd4DQGZW83L5POtshZbwykzdYkM52qB9U5qK5HBbepcZKjgCsfcSok8bEE241UN3aw+zhMei1EGbWkxJhZmVxE8u3NdLZ4+XGxTn4/JJlE5Iw6DS0Ozw4XV7CzAay42z73DzaGZ4UQqfDy6Wzvm6JKTkAACAASURBVFky0ajX0tnjHXDG0ggxEJwBNu3twC8l//diEc9fNh67y8fFT2wCVH98S1UnkzIjmDM8ht/9dzt/fKuE+84q4B8rd1HW6ECvFdy9bAQnFsZSkHz0ZfwCrXvhs78hO/rMXkafDiHxiuzlVKQf6WxFTvuNCgh+jyrzf/IXZfKgN8G82xB9XIUfKw6g79v1LS85LAhTMLK9Gja9qJ5w25Hln6r1FfArG9A+swRhjVJ+28Gxyj94/bPKzWrcOd9+0z8M7G1xct0L29hR280Fx6dy68m53PlmCQathrnDYzAbtXxS0kx3j49rT8zC55cIBHv7LCnf3drAJTOGZqIBKSlICuGlKyZS19FLUriZDmcxrXYPd5ySz+z8aDbs6eCD7U2cf1wqHl+A3c2OIQF6dVkbdR29LB4dj5RKCU2r1ZARbeFXT23mrMnJaITgyjmZ1LX38sr6Wjy+ANurOxmTHs6IJFVm73H7mJwVzpaqLqKDjaRHWwg16wd0Bw4L9ibkx39RJemeduTaJ9Q60R4kFHj34wK5HEfE/ORYw08mg+aHJK4AAa8L0VymXI5C4pWM4LfIOApLOLKtUu0WLRHI8DTlfFS9nv/H3nmHt1ldf/xztSVLsiXvvbedPckkkEUCYY+WWWhpocyWPQuUlu4WSltaaNl77xUge+/lON57y0OWNe/vj+vINhuSQMKP7/P4eSLp1es3lt577jnne75fkTUd7IlIR9rnk12+BuLsJk4an0xFax89Hj/1HQPotRoeW1XL/NJ4pufF0NDlQacVJDvM/HNpZVgVbEFpPBajDrcvMOKcoRD0f+y5j6PZ5SEnwRouj/UNBMiKjaCyTS1K4zMd/PvDKgIhidsbpLPPN6J3bRxkh9783A4umJnBjPwYOvt8lA1qefuDSvjhuDFJYbeeQwHZ1w7tFQgph4IzQNNOGH2yInjF5asZaCHA24N86y4w2xFjTlefOYB/AFm1CuxJCMvXE8o4XHCw9X2/EAazCrT7GboWJ6z9nxpPm3wBmGzIoB+58XFAII+9Ft77nbLwBGX7uugOxCFyC3t7WzOba1wA/OuDSn53Zim3n1SE0MAdL+/irlNL+NXJRVgMOv72zj78wRBXzs/lh9PS2FTjoqypl+5+HxfNyuTJNbWMTo1ibHoUb2xrJsVp5piiWPq8Qf774wkIIYi2GpEod6qpOdHUtLvRalTAL06OxGlVEx8Oi56kKDNXPb4Fq1HHrScW4bTq6RsIctMJhWTERnDJ/zbR0edjQqaDnx2TRYrTQnZsRNjDGtRm/8L/qM2zRsB/LpxAfpItPG52QJChkczrYIAvZF47MyFplEpwIpMQiZ/e1jjSIWQAk6/9iw/8BvF1A/Q3R1wBRMse5Dt3qywJEAtuRcZkq3k8GVK2gh+f1+usRb52U7gkJxb+Cll6PMIerzSFhQYx93pI+zz/7a+HDVWdbK3txmxQ1nP3vbuP82ZkcO+7FcTaDMwrTSDaauT+9yu4+OgsEqJM9HgC+AIh9rb0EQpJLpydwWMraylMspPoMDEqJZLW7gEqWvuIMOkoSLSF2dJr9nVwyf824QuEuOeMUrzBIOkxVs6amkpZcy8GrYbHV9XQ4/Fz8ZwsLAYNvkCQK+fn8vSaOlKiLZw0IZmtNV387ZwxtPX4eG9HC3OK4jhpfBIbq100uTyEQpJ+b/CQBWg50INcfr8agytdohSMegc1tuMLoHk3zLgUOiqVL7E5ChFfiJx6IbTtC/dG9y9Awhypem1HeID+xuFMRxxzDXLn68pSMjoTihYit78aVnQTk85VmymfWwn9eFxD7+/vHOkJfZCh047Mcgb8IW5/Uc0gRxi1dPQOkOy08KsXd1M2qBt//dPbOW9GBlcvzMMfDNHa62VqTjRaraCuo581FZ0s293KmHQHPn+IXzyxldK0SG49sQiNRrC8rC2s9jcjP4Zkh4ln1taTFWdlam40PR4/Erj7ld34g5IeT4B7393HtYvz+fkjm7EadRw/NjEstLKhqouTJiTz65d3kxZt4enLpmAb1BcYXvkKSWjpGWB6/ueTRb80bPGI2Vcil90HJhti6oVfKOUpbLEw52rl/220Kp7HxyBdDUqbwhABCYWfWI+PGAzfvBwG+LoB+psjroDamQeHFISkuwsaX1JjHADjz0YWzkMzvMfobh/qlwGytQwRmagkPQd3kXLlv5CRyYiuWkXfi809oC9We4+XnQ09tHR7iLUZufqJrfzuzFHctKSQ59bVUdXmpqrNTYRRx+KxicwpiuexVbXERxr50cxMKlvdCASbqjvJibdy3aJ8oiIMbKl2kRRloqLVTWvPAHuaelkyLol5pQm09gxw4zPbwwIG1z69nXeumxme1zTqtexs6CYnwcaoNAdLd7YSCIYYlRqJI8LAdYvzibebuOnpHVwyNxsGe3b5SXaeXVdPdXs/Z09LI85m4PdvlFOYbCfhIBnGfwKebhWcAXa+jph6oUrxA15k6x6oXjsUOAA8LuSOVxHpk5A7XlHzzVMuUK5Y1lhkXzvCdHCctv4/QWh0hNwd6p5o2AK730LMvgI5TG5Vtlcq20FPp1rop12M/Ohv6v1H/UT1Nw8R5pbEs7q8g2113Vw4K5PJ2U5m5EXT6fZz05JCzHoNr29tpndgqGfb6w2AUOJAAFcvyOWW53eEyVjlLb2cPyOTu17ezfPrG7hsXg6/fXUP6yo6SXFaeGxlTVjpb3lZO1cuyGVStpPyll4sBi13v7KLi4/JRii5HECVS33+ED+fm4MGRWAL/40F9A4E6PcFMeg1I0qruQlWIoxa3N4gMTYDbm+Qbo+faOuBm78IrR6ZNU21fjS6z13vpN+rVPwMZuVO9RkOVdLdgVx2L9gTkAO90FWDGH/WAV/rNw/5SWuybxlfN0B/Y8QVQDmn7FeMElpwJMO6/6nXSpeAqxbevB05+iRIn6Jmn81RQ6M1CER8gRK3MEQM7fZNNqjdoPowAEXHweTzVE/7K8I9EOBPb+3lqTV1JEaZOH5MIneeUsy7O1r4cHcrM/JjOW9GOq9saiTRYSYzNoJz/rkOtzfIpcdmc8VjW8K+sDcvKUQjBHe8pLKCZIeZ48clcvkjmzlnegbTcqPxB0IEgiH6vIEwoxpApxF09fm457U9nDA2kbtf2cPtJxfz2MpaPIPqST8+OpNIs56aDjcDvhAIwQ+np7GlxkVlm5vlZe1cMT+X7HgrEYO99aCEmQUxmPQa/vLWXnYM9v+m5kTT5VbGAlERX07c5TNhtKqMrUvNWsqeZkTqeOQbtw4dE/SNLL/qzUrYH6CnCbnuEcQx1yJ9bkT2zE/d7X+PL4GuWmjcHn4ozVGq1N3fCYBIHo1MHoOIy1U96IhoRHSWijyRiYeUKJYeE8FfzxlDvy9IlEWPQafl3xdOIBCSWIw69rX0sr6ykwtnZXLPa2UEQ5JfLMwjzm5kfmk8ZoOW2YVxvLG1ORygTxqfwm3P7yQQknh8QZ5eU8evTy9Bg6Cm3c24DAfv7mhFI+D8GRkUJdmxm3X8+uU9mPQarl1UwM76bv55wVi21HaztaaLHxyVjs2s43/Lqul0+zhzaio/n5vDpqouTpyQxBtbmyhItHH94gL8waHMLTM2gusW5ytSmISyxl4iph68iVih0X6q5oMMBdW95/MgNTooXwp7P1DVqxmXqM+5u0mNMRqtSkNCb0L6+hHpk5F73oGIaKXfHvB+rXX028d3IIP+pokrxOYijr1OsXNt8UhHqhJxN9rUXLTJpgwvlv4JlvwO1j8CjTsg6yhYcCtCa4C4PKUONu8G5OoHlWDJpPOQr98y9HsqlsOYUxQR5ktCSsm2um76vQGeXafEBfyBEOMzHVS39/PuDiWjt3RXKzcvKeTCWZlsrelmW62S6VteptiaTcOUjPY295LmNPPvC8fT0uPFGaF20edMz2BdRSf/XVaNUa8hPspEqsPMBTMzePCjKrwBtVuvbnezvlJl4dXt/dR0uPnbOWPYUd9DXoKVpTtbeX5DA/GRRi6ek81tL+zkr2ePobvfz8MrahiXEcW+lj5e36J6imnRFm44oYAW1wDvbG/hb4MCESvK2nnoJxO49qltRBh1/PEHQ/OkXwfC4oC51yGbdqlZ2sRiZNNuGHUibHtZjc6FpPJ73v4y2BPUqIfQICNiVNUkaTTEZKH5PjB/LUj/gFLtS5+sZHb9/WqjqzUo96qgHwwRyIQiNMM0CYRWD85DTwjdD6tJP8JEwqDXsn97mBNv45YTi/jX+/u48fgCxmZEYdZrcXsDnDMtHb1OgzcY4JYTC/nz2+X4AiFKUyOVDvNglqzXCpbubOXVzU0kOUw88KPxmA1aHBYD/1xawUPLqsmOj+Du00q4/pntrNrXzikTUrjntTLqOj384rg8Is06NlZ30elW1b+nVtdx85JCJJIYq4EZ+bH4AkHWV3ZQ1drLtPxY0qIjcFqNTM6O5v0dLRgNWi4+JusLR7oOCuo3q1aiDCGO+gly99vq+cZtyLpNkD5RvT6o1ifm/BKypyMCXuT6R9WmuacJaY1FRCYhIxOPvA3ydySD/kaJK8JggaQSoEQ9BkLjf6DmmJcPSoGWLoG+NkRnFXL/zr9yJcKZrliH0ZnItnKlOpY+WblgmeyQMhaqVysFnHFnKgesr3BtZY29bKt14fYGGZMWxcbqLk6ZlMI1T237BFPUEaHnF08ot6l3d7bw13PGMCUnmqxYxdLcX6bOirNiM2pp6vLQ5w2S4jBT2dZLitPMf5f1AOD1h3hrWzMXzcok3m7kh0elsaepl9++umfQBacwzCz3BySvbW5iwah4JPD8BsXva+n2sruhB6tRx3Pr6jl+rJplTnaY2dXQE77u2o5++gYCNLoGMBuHpCB9wRCbql3hedGbnt3OEz8bqdX9VSEik8KiCdLXD5ufgqJFiHFnKL/iFfcj846BwoVgi1WbtoAPZl+JCPqUM0/1Gsg4ChHhQPa7VNZnjEAc4SpH3wiadiDfvktVrEadhEgoREYmDVYsClXJMyp5RHD+ttHZ5yUYgli7kcYuDxuqutBqBDctKSIu0kRVm5vrnt7G5OzosOPUxXMy2VzdxXnTMnh5UyO/f30Pvzm9lD+8UYbVqOPnc3NYubeDuSXxvLujhfpOD+dMS+fNrc3sblR97YoWN90ePzedUEhJso0n19SHSZV3vrSbe88di0GrZVjcJ9Zu5NiS+EHFPoHHB+9sb2VithOr2UWPJ0AwFGJrTTf//KCSQFDS2uPl53OVsuChQliRcX9lalh7EFDzR+6uEVK6smI5Inv6yIoWKOb/+kcgIlZl3sYjxFVO8t0J0N82hABZ/sHQE7XrYNJ5arEecaAWdryCzJ4B79ytvnh1G6FlNxx7HWLqhci8OQhvH3LFP0CrR867EZH45czm3b4A/1teQ1Wbm8vn5TCrMJbRqZH896NqGro8LBqTyKrydo4tjifyY+QqV7+f379exviMKH5/1ih21PdgN+mIthm486XdnDMtHYtBw4X/2UAwJPnvTyaM0OItSLRT097Pir3tlDX1sWpfR/jcsTYja8rbefxnk2jpGWBmQQyXP7qF6xaPNBixmXQM+IPER5p4cWMDd5xchNWoozQ1krtf2QPAcaMTeHNrM5Wtbn40K5MPd7fi9gY5bnQCte1DN7IvIA9ugUhnhMTSQU3tAWUHaohAZM8Agxn54i+R+xmoMdlIa5zabAFSaCBtIvKje6FxK5gdap7XmX4wr/A7B9kySCfx9sLGx5WN4O43YddbyMRixJQLRmx0ZNA/ZCv5JUQvDja21rq44tEteHxB7j1vDP94r4KP9qhe+Q+PSuOK+bnsbeqlJDUqXOEC+O9HNdx//ljqOj2Mz3Tw5Opayhp7mVUQS0KUifKWPl7d3Eh2vJWrF+apoP3IZqbljswI7Sa9IoNa9ASCI7/9Oo3gidW13HFqMQJBhFHHQx9VsbW2m3vPHYPJoOOW51Uba2dDDzmnlrC6vJ2KVjcr9rbT41FEuwc+qOSsqWmHNEALjRYZkwPN6nqkqx5KTlBl7rgCRMpYFbws0dA/uM7sJ9hGJqq1d90jiriZMk5JLrfuhUnnwJESoAe5+ocTjtgAjd6ipBw7KhXZYcLZyO2vIJPHQP6xUL8FMo9CWhxqUff3D/UqQUl9BgNKnUyGkM9eqsp3QZ/Kyk+450sRjCxGHY0uNSf4t3f2kRhpZOFPJ3PVwlz++MZepuQ4ue/csVS1udnV2Et6jIWa9n6SokzhG3pmQSw/eWijqgxIyEuwMrswltJUO42uAa5bnM/f36vA4wvy0I8n8O72FgqT7YxNj2J9ZSc17f2cdVQaW2pdDPiD3HlqMT0ePwvGJPKTBzfSOxAgI8bCxXOyqWrr545TinliVS2FSTYSo0zMLoglzmaksrWPgUCIW1/YxsQsB7ecWEiM1UAIuPbJbVhNOlKdJp6+dAoBKUmKMrGhysUbW5uxGLTcdWpJmIl6MCA0WlXebtiqtNVLlyg5wchEZE+zsqIcnMnFaIXAsHnNrlqwJ6jgDODpQtZt+j5AfwFEUqlyKEIqopfWpHy5AarXIFPHIwrmAiD9HuSe92DTUxCVCrMu+1xbSSklBHxfOCL5ZdHj8XPDM9sHhUhgfUVXODgDfLC7ldMmpZAQZaJ56wD5iTZWlXegEXDZvBw6+3wkOQYz7MUFeP1B/vDGXn5wVBr3vKY2Ku19nUzIdPD2jmbe3NrMgC/I9ccX8O72FsZnOli6u5XGLg93nlLM2AzV1mro8nDZvBzWVnRy6bHZRBh1PLqyhli7kRn5sWyt7WbV3g6KkkeOobn6fUQYdDS5BsiJt4YrU1mxEZgNh15BQ5QsRpojobcVkTMLqdFC3hyl6KgzQnsV4ugrlPuVxalkmBlUcyw+DtInI1vLlAhKKKCU6Q7yGOshx3eExf2tQ5gjYcYlqpwZlYLc/Bx0Vqkd4MRzYcY05Vi16y1YcJv6spUcDzteVQF97OnDzOaFIpDt1xzWGb+0pEx2XATXLcrnjpd2IwRcfVw+Touetu4BbjmxkPxEG5Vtfaze18E721u489QSIs062np9vL+zhcvn5ZCbYMVq1IUlOCPNes6YlMpP/7eRTrcfm0nH3aeV8Ny6BuYUxvCjWRlUtrrZWNXJjc/uAGBbfTf//fEE/CHJXS/vZk9jL8eNTmDh6ASeWavY2KlOM5uru6hq7eOGEwqINGnxBSSTsh38b1kN8ZEmGjo9nDIxmeq2fu58aTe/Pb2U/3xYyf3nj8Nu0nHlY1uZkhvNHacUE2HUMa8knneum4FWoyE+8uCwu2XQr8wafG6ISkXkH/OJtoOwJ8D8m5GrHwKTFVG4ALntZfWi1oDInqlKb8Pfc6SOfnyTSChEnPAbNW8elQz9rpGvDy8BdtbBfoJl6x5k2XuIyed96mllfxdy5xuqGlK8CJE69nNNGb4shl/OvtZepudFs2KvyvCOyonBpNeSl2DltEkpWAzKcKY0JZJ/Lq1kV0MPMTYDPzsmm+uf2s4jP53IP84fi6v/YzoEEnYMaup/sLuNRWMSiLcbeX1LEw1dHgw6DULAa5sayUmwMjHLSbzdRFGSnb6BAJc9ujksm7tkfBKFSTam5UVjN+uZlhvNyvIO0qMtTMxycPsLuyhv7uNnx2YzKz+WCJOOiZlOYm2HaHJiGIQtDjHmlKHHw16TzbvV2KoMgTkSseiuEQmM0BkhKkl5hM+8TJE5E4oO2Sz8IcP3Je6DB9m0A3a+Btmzhnom+XPVaMj6R1TmPOGH4HdD0ihk8CglDWmyI2Oyw19AYYtV5LHl94POjJj58y8tYGLQaTlzSioTs5xoNAKnxcDbO1vwBEKkOMy43D7WlHdSmGRnXLqDZtcAeQkx/P29fVw4K4tHV9bw6MoarlmUz3Pr67GZdJw6MYWy5h4mZUdTPLjLthi1XDAzg7UVHTy7th5fUDIuIwqrUUefN8AJY5P4y9vljEl3sGewR/bG1mauWpALKMEDm0lHp9vHglEJbKt1kRVn5Y9v7uWyY7MZk+HAYtBQ2+Fh6a5WJmU5OX9mOoGg5LdnjqK910tVWz8XzMrg7W3N9Hr8RBh1aDSCJMdB3iXXb1FkFKTahR9zjSIr9baqDHpQpUoklSKPvgrqNyHf/z0UzEOkjoXEYtU7DfgQc36J3PUWJI9SP9/jcyG0esXaHYQ0RcLUi5QyX9CHGPE3/Nhi9nnZR/MuqNuIyJ6BrFiGHOiG7JkI09f3Drab9fz6tGJ+/vAW+n0BSlOiSHWaObY4nqCU5MZbyYyLQK/VMDHLyYMfVjI5y0l5Sx+7GnqIMGpp7/XR3e/nuuMLuPuVPZgNWm44oYAr5ufyj/cqyEu0cvKEZEpS7Fz+6BbGpUeR4jCTFRfBG9uUXeS509Pp9wa5dF4OXW4/VpOWydlOLAYdT66pCwdngPZeLzcvKeTNbc08trKWK+fn8OOjszDoBGnRZq5ckEdFSx/FKXb2NPbw9Jo6NEIQF2k8pCXuL4Js2QMIGHsaWJyKlOtxIbxu5LYXYaAXMfY0RGyO8jw4YvF9gD5oECa7Yp3WrEGMPhW5/hGENQZZ9q46wOdGtldAXC5CCERkshoBMUd9MiNLGqUY4EL7lUkNJoOO4kH28gvr67nxGZXVPreunl8el6+E+zc3cckx2by0qYHHVtXwjwvG097rZXONCynhntf2ML80gfxEG/e9u49fn1rMjoZe/vimkvz80cwM6rr6eXe7Eu44fXIKq8vbOHF8Eo+tqiXGZmRjlYvJ2SN7ZKnRFpaMT2JchgNvIMT8UQn85W1lUv/r00qYXxLPE2vqWF/ZxfXH53PvIEO7rrOBtBgL976zj18uymfFnjZWlHcgBNx9agmRlgMcqfocyLL3CN8oLbuVPOF7v1Vz0joTLL5LLQSgJAr1ZuTEsxFBP9IaFy5jC51BLRaZU49sl51vE0G/6iXWrld/y+ETDo40mHw+NG5X43CJJaqH3dsM9kQ1hjNYxZC+flU2Xftf9d6adWrUJ/3rG9UAFCdHcs60NDrdfv7zYRUXzsrk/Z3NmAw6nlxdx/3njSUtxkJ3v4+TJibT0evDbtJy+8lFNHR5SIg0kR1n5dqnttHao9ol3U9v58ELxzOrIIaOXh9dbqWV/8pV0+j2eLnh2Z3cfVoJSQ4zHX0+djd0Exxs+cRYjcTZDTgi1N/JpNdw0wkFuH1BfIEQiVEmfvzgRq6YrzbOf3l7H6/9YhoFiXZW7evg4oc2ht93xfxcNte42FzjIi3azKTsg8eIlj6P0tgOKG/vL2Jbi+hMZOkJ4KoHBKx7FHJmIHvbwtoFsnUPnPjHTzU1OjIgD7sS92EmDf7lIH0exdaNK4BxZ0FELNIUBSf/GZJKR5Y2o5KhvRr2LUO+fI0iFg2b7xwOYbIfMOOwvLk3/G9/UOLxB8OP9zT1EmM10t7r45Hl1WTHWjhxnOrZub1B4iKNZMVauHZRPhqNhtcHHXlA2UGmRw9d25YaFzML4slNsPLHH4wiNdpCIBSiq9/HojGJpMdYuHx+Du9sb2Z3fQ8Os44Up5l/vF+BlBAMSf705l4Kk+2sHzS69/pHfjm9gRBareC9HS1hHzYplT74Z7lrfR1Ibx+yvRLpGlSPHU7QM9qU9rZncJIvMKB0n2UIGfQrxrcjHba9rHyLNz0FniEGugwFoXEHoXd+Q2jzs8i+Dr7HV0BrGVQsU3rMe96FtiFPHGEwQ85sJZu76gFE8y7kqzcgP/gz8tUbldLf/mMTiiAUHHFq6T7wz8Ko1zIx28kza+to6RnAoBOsqejiw91t7Gvpo6ypl5c2NnLMb5dxyl9XY9BpSI+xcvfLe/j3B1Xc+dJudFqBa5gRRVuvl7rOAc68by3XPb2dmvZ+TvjzSs64bw1NLi/XLspVAkHP7uCPb+7l3Z2tdPb5+feHVTyysobdjb24Bw08xqVHsa6yi7+8Vc6zaxVJrd8XDK8LefFWYmxGNBrB7oahadUBfwhvYOh+7Bs4uMpssnoVctnfkG//Grn8H8o+FJDdTci6Tcj2CuTwYJVQgIjPR0RnwuZnVEXL51FTFPvh6R4hKHXEQSqexGf9fBs44jJo6e1DbnkeatYiRp2IRCrVmsQSCPqRva2IWZcjyz9UzyUUK5JR+dLwl0m+9zvkglsQZsdBtx6cV5rAwytqGPCHKE2JDJelDFoNM/Jj+N3rZRQn2zm6MJbtdd2cNSWFqblOrCY9eo2gpWeAilY3Ld0DFKfYWVuhhCFGpUbhtCgCVozVwFUL86hs60Ov0ZAQZWJXfQ+3nVTE8rJ25pXGc/6MdP71fgXHlMQzMz+We17fy8LRCURbDWHySazNiN2sLPGCIUmTa4CFoxNo6R5g0ZhEkqLMOCMMHFsSz0sbGsL/xzHpkXy4u5XCJPsB952ltxe54UnY9YbKjhfeisiZCeYo9VmmjgP/wMckPKOQH/xZlbzHnYH09MDA4OLW26IIYvvJSl21yLfvVKSVmrVInQlRevwBXfP/awyuU9LrBp8b0duK3PmaenKgeygDCQXUZ7G/0hGVTCh1POz7UH0+Jjsi/uAYmUzIdPLGL2fgD4ao7+wf8VqkRc/lj21BoKYmbn9xF5cck41vGOO6vLmPq4/L5Z7XytBpBLcsKcTt9fPXc8Zg1mv489vlYUb1HS/t5qJZmViM2vBExamTUvjr2+Vh3fva9n5SnGbyEu209HjDWghtvV52NfQwMTOKcelR3H5SEdnx1rCA0NgMR/hedETosQ6uHVNynBQcRJ/1UHcTuBohsRRRmqVMTvpdSK8b+eavVAVEo0MsuhMGzWaEzqTG7bobh07UuB0x/kzkyn+pz33iuZ+wej3y8H2J+ytDutuhuwmMNmTAB9teVJKOK/6pGNigvkw9zbD870hDBKRPVcPyK+6H3KNHli5kCKpWI+s2GwSUgQAAIABJREFUw/wbDup87NgMBy9dOY0ut4+QlLyyuZErF+QSZdFjM+mYkR/DqNRIfvHkNow6DdcfX8Cf3yonOsLAzScWEm01cvNzOwHFNJ2RH4Neq6E01Y4/ILlqQS75iTauenxr+Mb+69ljSIwyo9cI0mIs/OnNcoSAn8/NodE1wP3vVRAMSR5fVcstSwp5fWsTBq2GM6ak8uL6ev5w1ihe2tiI2aDl6KJY9jb1KXcgnYY//XA0Jck2pufFsLaiA5Ney7I9bdzx0m5OGp/M7acUHRhzu6dVBWdQ2fHWF9DMvxlyZirRxO5G5PrH1DhcTzMioRjZVq5EZQD57m8Qc28YeVsNJ6b4+lWw2I/uBr7HV0BcHmTNgLr1kDUDaYmCsvdBo0NueBwx9rShYw0RaqxRBkGrV9oCw6CJTkcuuAX6OpS5SeTB8xBPdirCZ6zdyL8uGMfayk6m58WQ4jRzw/EF9A0EsJp0uNx+0mMsxFgNtPf50GsFJamR5MVbGZUaRY/Hj0GruBhPrK6lpdvLRbMz8fiC7B10devo8/HkmmZuWlLI+ztamJzt5LlhI1y1Hf2EpGR3Q88IASKA3Hgrlx6bw8sb6/nPR9V0uf2MSo3kPxdNYExaFM9eNpXWngEyYiOwmXRMzYkmxm4k1nZwmO9SSsXbGZTLlXUbYezpSINFTbaYbCpAhwLIhi0j3OCEI42Qf0AF4q3Pq010bC7i5D+r6khk4hGqHjYMB5gpCyEeBIqA16WUd33OcfHAW1LKsZ93vsM+QEt3O/L9P6pepFavFmONTmVVw4Ku7O8akib0uRGRCcilf1DHbHlOKeOseRBCQcS4M5Fbn1dMVVfDJxaSA0VeoiK+rCxro7qtn6fX1BNjM3DNonyOLY7juqe3I6UqY22q6uKiWRk8tKyabXXdmPWqdDw9LwadRpARG4HTomddRReJUUay46y4+v3h4AywvrKT93a2cPMJhUzJjqbXE+D1LU00uTyMy3AwqyCWpbta8fiCbKju4rTJKYRCcOnDm5lTFMcTq2oJSsm7O1qItOjD/tW+QIj73t3Hs5dNJS1GR6zNwOI/rqCtV5WxXtvSyFULcw8sQOsMoDUMlcbsIxdt6WpURg0BL0JrVKSl1r1DBwzO4YrxP0B21iBSxiCdGUMcg8gkSJuoeqh6EyL36K9/rf8PIayxMPMS8LqRHhe8fK0qfWp0yjCjZp3S4d7xKtLViFj0K3Vf2RMh5pP2qMIa+6kykwcLEUYdc0sTmFuaAEBdh5uHPqqiedCA4uYlhZj1Wp64dAo17W4cEQZq2vuobXfziyeUHe249Chi7UZ21Kuy7z2v7eHGEwp5ZEUNF8/J4nevl9Hd7+f+d/fx6M8mIqTgkmOz+evbir9x6dxsuvv9bKhy8fb2Zq5ZlM+7O1oYnRbJ/NIEBvxBfEHJKRNTyIyN4KnVtbjcPmJsRpIdJqwmHdFWA44Iw8FxsBqO/ZyC/fC4lAjU9pegarVS4otKhfKlCGcGoDbJBP1gjUMTl0fI4lCES2MEGnviwb2+bxUH1oMWQpwMaKWUU4UQDwkhcqWU5Z9x+B8YMpz6TBz2AZqeFhWcQZWwa9bC0VcrdShz5CBxyIgwWCF5DLJyhfoja/VDf2xvH7JxGyy4XWVpax5Si4jQjMy2DjIiTHpSnWZmFeSTGGnixkErx/0jVT+fm0NVm5t3d7Zy+bxcfIEg7+9q5baTiqhs7ePPb5Wj0wh+c0YpfQN+oq12PtjVRmZcBLE2I229XrQaQU6ClWfX1eENhnh0ldLcvuH4AnQaQSAoOXliMvNL4+nu9+O0Grj+qe387JjssGl8YZKN59erzFKv1WAzDY18JUSa0A+6B1lNemYXxoUFH2YXxh64s1VUCmLBLWpMzpGCKD4u/JIMBRADLuSq/6id/eiTEQNdkD0T2Vqm+qLFi5E166Bhq5IGdaajGcYjEBaHcsDqawWDBRGVcmDX+/8QQm8GvRmadg71JUMBRRgz2dRttuBWRIRTyeoeRujo84WDM8CKve2A5EezssiJt/L6lkbqOgawDzOy0GjEiBJ4SEJ6jIW/nD2aJpeHYFBiNmi5+/RSsuNsCCE422pgel4MWiHQaODDPe2MTo0kGJJ4/UGiIwwcWxyP02rgpmd38MKGBi45Jptd9T2kRFvo9gSoaXfz0/9upKypj2OK4rjz1JKDbkwjdAYYdSLy/T8AEnJmI9ydyB2DbYrypYiZP4eMyZBYgmzcoVpEAa/KtIsXKeOM/k7orEWGgt+xe+qAMujZDKlrvoMylPpEgBZCzAHcQPMXnfDwD9BG68gMKzoTkTkFvH2IpFKlv2yKVAt87izEpPNUEDZYlPzn9pdVvyttAvLlawCUM0/bPtXfjM48ZJdekGjjnOnp7GnqRa/T4PEFeXJ1LdcuzmdVeQedfd6w3vWu+h6uW5zPxqouTp+cwqMrawEIhCQPflTFVQty6XJ7KUy2s6m6i7tPL6HX46er38/Dy2uYUxTPw8tr2FanerGNXR4e+NF4VpR34PYGeHh5NXedWsKysnYKk+z0+4JMynQwNS+GwiQbhUl2WroHKEqy8bdzxnD/+xXE2IxcvSAvbGtpNmi5akEuRxfGEghJxmY4DjhACyEUsS+xOMz4DaOnWY2+yRD0DSArlkPmdAj5YNblCL1ZBYy37lTVlYJ5EJv7yd9hiQLLpzvxfI+vgMhEpRcQCgzek37YuxRYCu6TPnMG+ttEnN1EbryV8hYlwTkhc2gMERQ35KFlVVwxPxeLQUu/L0hVm5u/njOGfc19tPR4uXphHkadljP/vha7WcfZ09JIdJg4Ks+pvr9AtNVIl9tHs8vLTx7awA+PSue+9yrYWNVFskOV2XMTrLi9AdZVdlKSYqe+y8Mrm1RPd+Xedv569hjKmtR1vr+rlbMaug+Nc1zaJMSJvwO/Fxwpymt9OAwWRMZk5fm94fEhMaDNzyjpZIsDXrtZ3ZcWp5qqOIjtim8Vn1/ijhFCbBj2+AEp5QPDHkcA+3toncC4j59ACGEAbgFOQplOfS4O/wDtSEMc9yuVGTvSEOmT1UJusqsfZ7pi6hbOR2h1SEMEoqNKCSjMugJRMFd90V69MdyLlNtfQSz+tdpNfgqk3ws6Q/jm+6po6R7g8ZU1rNrXwbnTMzh+TCKBEPz3xxMpb+klL8HK8WMSufm5HeH3BEKS9BgL1y8uINVpGaHNnRRlpn8ggE6r5ZqnlDLWixsbeOiiCVhNei6bm4NBL/jD60Olq3Omp3PNU9uoaHWTFGXizlNLsBp1LB6TQKRZz8ryDq5emMfmWjXGEWM14LQacPX7SIwy8+jPJqEVGrSakX+DhCgzCw5S2U32NCObdqpNmDMDbLEjg7Tfywi5BKGBCAe8/3uwJSCPvlKxSk+7TwUOW9zX/sy+x5dAbI4SMeltVZvipX9Uz6eMVeONDdvUBvoAZpsPNpIcZv5+/ljW7uuk3xdkVXk7Vy3Iw+0NsHJvOzvre+jxBLj/vQoum5dDnN2I2xvklU2NnDIxham50TywtIIBfxB/MER7r49/Lq1kTHoUp09KBdT9/tGeVhq7BkiLtjDgD2Ez69hYpaYjGro8dLi9xNmVeuB5M9JZXtY+gtDW4wl8Inc7VAYZQqcfsZGVsXmQOkFJIKdPhNg89YJGCxHDRqZ0RuiqQyCGKin9ner78J0I0F9Y4m6XUk74nNf7GCpbW/n0KanrgfullK4vs1Yd9gFaCKHUjRI+m/Ep+13QsEU5HOnNMPsqxNQfIz09yO41qgc5fOGPy4XOGkLtFQiLA7lf/CIUhMoVSvEoqRRKT/habiyr9rZz33sVAGyq3sJzl09VveDCWGYVDvXfLpqdxfK9HXT3+zlvejqufj/+YJAnVtVw33ljefDDKuxmPTPyY0h0mNlSM6TqJCXsa3Xz65cVmeuuU4s5b0YGv3l1D4FgCKfVQEWrYpV2e/zoNII3tzYxtzSB93a2Mrswhlc2N/HEapWpZ8RYOHliMh/ubiM/0UYgJMlLsBFzsMgpfW2KxGe0gTNdtR2W3ad24AYLrH8UmTUdio8Lqw9Jb6/qc257UVVBxp6uPJ7HnQFGO1gc4HVD215kdyPCman6z1HfhcXi8IMQGrWwx+aqsZzEIjUXG5WifNZBVa3Gn4XQH3rlqy+LnHgbCZFmml0eFo5OIMVpYeXedi5/dAtXDs4jd/T5+P3rZdx77thwLxqgKNnO+7vaaHQNcMW8XO59dx92s45blhRiHOSLLC9ro7nbS017P6NSI4m1GTHqRq7N0YNz0TqthtMnpzImzUFrzwDbarcQCEnOnZ5OdpyVi2ZnsmxPG6dPTqX0AJzhvgjS74Xa9crPIHU8TLsYIUNIIVRgBmgpQ2RMRsoA9HchsmeqtXH6xUMn0pvUPfydwQGVuDeiytprgNFA2acccywwRwhxKTBGCPEfKeVFn3XCwz5AfxxyoEeVXEyR4QxYdDeo4Azg9yB3vApjTlUjHfuWKVvKhbcpt5aIGETWdCVbF/QpBvjUC1U/U6tXQQOUxrczA/K+Oqmotdc74vH+mciPY1RaFE9eMpkut48ddd38+pU9/GJhHjqNhg2VXfzgqDT8wRA763tYV9nJ0YVx4f5wVmwErkEbO18gxNvbWwgEQtxzRimRFj2hkCrf2S06LpubyxOraom2Ganr6GdCpgOTTsvG6q7wtVS395MRE0GKw8JtL+ykdyDAnKI47j69hDj7AY5S9bYi37tHCSNoDYjjfgURTmjehZh4thrzADXDHJ1BqKsOOqoQeXPUZ5kxVQkqBAYQMZmKZBSZgLDGEtr6Iqx7WP0ecxRM/xn0NIDBCjFZRz6r9DCFMNlh6kXI3lZ49zdDL+x4DYoXqYX7MILVpCMnYSiz7+jz4guE2NnQwyXHZFPT7uaUSYq0NSM/hp31PVw8J4s4uxEhYHdjL4mRRiWnGwyFxwullPR5A2Fi5fu7WnngR+No6PRwy4mFvL6liRn5sUzMGgpiNpOe8ZkOgiHJq7+YjscXJDPWQqTFwHWLC7hsXg5Wo+7QVoPa9ykSLSiFN1u84u18+Gek0MLsK5Af/g3cbUq609OFbNyBKFmEbNmLWHCrGoOMzUF8gzajhxQH7mb1ErBcCJEELATOFELcJaW8OfwrpJy5/99CiA8/LzjDERagpase+cFf1BzluDOhaKESS9AZ1Jdrv5a2OQoRGEB2ViOOux3Z04KIy0PMvV6dp3bDiIF62dsKvn5EYtHI3zfQ85WsJ/djdmEcDy+vprnby+yCWHLjP910o6V7gFuf38n0vBj+8nY5l83L4Q9vlIVnLk+fnEJpaiQPLavm4qOzuP6Z7fz0mCysRh15CVZ+8tCm8LnSoi0kRBl5dGUNm6pdSpTkgrG0dHu56+Xd9A9jfRen2Nlc4+LE8UlhU4Bji+PocvvYVtcdJogt3dVKZav7gAM0Pc0qOIPaFFWvQYw7E/LmDH1m+9Hvgg2PAygpwSkXqCzZaEU60tDYE0Ye37B16N8eF6KvDbn6PwCIo6+CnFkHdu3f4zMhLA7Qm5BxeUoZDBRzW29CevvUpsoYqUqqhxmKku0kRCo97ZIUO38/bxyp0Uqy9u/njaXfF8RhMSCl5N8/msD7O1uYmhvNBf9WznITMh3ce+5Y4iNNdPUNfYf7BgJ0uf3MLIjFH5ScOjEZm/nTW2lajSA/0faJ5w6m4cxnwjtkG4vepCZj3v+9cjEDlajkzILeJuVfYItX7cTVD6qM+cTfo0n9RIv1yMcBBGgpZY8QYjYwF/idlLIZ2Po5x8/+onMeWQG67D1oV6MMrH9EKU7F5yOdmYjZV6lSqCUaUTgfuepf0FWHrFiByDwKWbUaaU9AE52pvmxGm/oyCo0yXrDGgj1ZSQ/WrFNOSEmlyKZdyozB8eV3ifmJNp69bCo9ngBxdiPRn1Emrm53MyHTQUmKHUeEEgzZH5wBatr7WTwmEZtJR8eg3CAINla7sJn03HfeWF7a2Eiq00xhsh2PN8CmalUGr+/0UN3eT2mqfURwbuvxYjFoqWrvZ3ymg39fOB6PL8i4dAdba10kDesvazUi7Cl9QDDZRmyghDNdbawm/FCNcMTlK8WqhGKkdtji1FKmPLqX3acqHGkTCU06D41jiDUqCuYiG7aoB7F5yOF+tbvfhqzp38t8HkIIvRmm/AiZNAqCfkTG5MH2xd9VFWr0yVC86Etr239TyIm38eSlU2jt8RIfaSI12kKzy8O+lj4iTDqKkuzoB8vUc4rjmFMcx+WPbCY4aOy8oaqLhi4P8ZEm5hTF8dCyKtzeIHkJVkpS7MQe6Kb2UMOZrgiyMTlgjYHmnYgJP0CufVhtrBKKlfFFV526PzOmwId/UTye4uMUb+Q7BwkHaJgrpexiiMl9wDiiAjRCo8wTIpzQsgeEQAYDaPRGyDoKmVQKHhdyzX9VGdvrRsRkDSlJ2RMJzfklmthsWPxr5X6lMyMNFkRMllpEZv5cqeoALL8P2bpXKVwtukMZbXxJJDstfJ6lfVlTLxf+ewP9viBWo46/nD2GfS3KgeqNrc3oNIK5JfHUtLu54fgCvIEQWbER/OpF5df66uZGHrxoAhfMSOeBDypp6hpgRsFIDVy7Wc+/P6zinOlpPLqiFrNBy0+PyWJTTRcbqrp4fFUt4zOiuHFJIUlOM0lOMyWpdrRawZYaF+dOTyc5ykR9Rz9REXqsX3dn78xQRL+q1arXnzoeUBmYsDiQ825E+voU0cujvIUJeKFoviIH+gdtJGvXI5JGIwNe5TZmi4O0iYjj74b+LqTFCe//Yej3JhR/H5y/AQh7AqJkcfhxaNMz0DzIDN7wOERnIVPHIYRAerqVn7Ah4jMFgmRfGwz0KmOUQ8i+T4+JID1GjeS193q54ZkdfLSnDYDfnlHKnKJYYoa5SI3LiOK1wakLm0lH1KCy3+j0KF644ig6+nykOM2kOA+vzcinQdgTYMGtarxq45PAYIto1Emw5y1E+iSlfw/QVYtIHg1zfgFanSICflfvq+/drA4AWdNVubSrTpljuOph9YMw+iRIHY/GZCPkcYHFoXSZ4woU6WG/klRPE6KnEWKzVd9ksHcyvIwt9rPD67eq4AxqbKtm3VcK0F+Etp6BcGbb5w2wvrKDM6amMrswlvxEGwmRJno9frbU9jAtN5px6ZGsrRjqGUsJFS1u7nxpF1cvzOOFDQ0YdUpgf+XedkpSIklxmKho6cM9EOTKBbmY9VqaXB4ijHrKmlQpa2O1i5V7O7CadOTG20iNjuDyeYo4U9fh5tJHNrOuopOTJ6ZwzXF5XyszUES/IqXH/CmQoaCyBa1eC5lTYcFtCJ9bLeZ9rUMHanRgi0W+egOYbIgpPwJrHDjT1blr1qkZT3c7wmhDpoz5ytf6PQ4BOqvUPWmOQq74hxKNMUfBcbeHxTD2Q3bVKblJd7uS6p19hRI3OcRQTOy28OPnB53lFo4eEuJYNCYRu1lPTUc/xxbHkRVnpbbdzYd72giFJEcXxh0RwTkMk10lOvvhcSFSRkPB3KFK5SBkwIcm+//B/fS9WcYBoG4TVK1S+sqrHkD0d0FrGfK930FnDQBioBv2vq+O76hE2Ift0rUGMH06M1IG/ciWMmTtBmRPC5isSrZwEJ9nRP91kOK0kDg446jVCPISbcz97XIeW1mLQSt4dXMTd7+6h9YeL67BQB1jM4R37UkOE1ERek6dlMpz6+o5piiOxCgjxck2zp+ZwZziWN7Y0sR954yjuXuA1zY3YTZo+dfSShyWkZmwXivo6f8kkW3Nvk7W7OskJJUz186Gnk8ccyCQrgZCK/6FqN+s+lx9rbD9ZYSrDvraEHoDOFIV4S9lnFKsKv9IqViNPhn54V+VAcqW55E+NyQUqeqK3qQ2BIdwxv17jIR0d6h7p3E7ZB2lKl16CxQvUm2i/g5w1angDKrSVbXmk+dp3KaCM0DTjvB9fahht+iJsQ31igsS7ayv7BxxTKzdxMkTU7hqQR6lqVH0Dfj51Yu7uP2FXdzx0m5ufHY7Pf3+j5/6sIXQaBHFiwinKKkTwJ6AiHBCdBakTVBroDMDkVDwuef6bmBwzOqzfr4FHFkZ9MDwACGHMmMZGhqmH65kFPQhhQ4x+XykpxuRWIyMyfkE8UsGfMpQo32fyry2vaxmqBfepsQxYnMg+XMlU78yMmIjePSnk6hsdWPUa/jVi7uUXvbqWu45o3RQ8QiWl7UzMctJlMXAH97Yy/kzMshLsLKjoYebnt2BLxDilhMLGZ/h4JGVNTy5WvVg05wWfn9WKdF2A49cPImqNjeVLb3cfXopdR39XHx0FsvK2jgqN4bufj8pzk/ONuu1I/dvH5+JPhDIgBe55iFE6ng1SzkcA93IrS8gZl2h+l65RyMK5ikyn04P8Xnqc9lP9Nv6gvIWjs6ArGkIph206/weXww50KN08fcH3yk/UiTOhi2KxOfuAFuickBSCuvquE8ZYRSmyJGDLt9Q7zrVaeE/F03g1Y2N2Mx6mlwe5o9K+Nz3uAeCIyYhNte4cHsD2C2HHynuM5E2AbHkHvB5kI4UcDUQ2vQMIm0ipI5HZExFOjNU209n/Fpjp0cMJIddBn1EBWiRNwdZtUrtsAvmqwUbFNtwf4brTEfM/Dly20vKr7a3CVmzETHlPJACjdGibO5ayyDgQ2r0CL0R+c6vAZBag3LHcrchkkd9zKD+4CIrzkpWnJVttS6qBp1wVAtkZCCMsxvo7fdR3+XBGwjR7Qnw7Np6ipLtVLW5Mem1xNoM5MZbuWZRHk+truPcGen85rUyGjo93LikgIWjEoi2GTjxz6vwBULkxFu5ZlE+8XYjcXbjp7pSTcp2cvLEZFaUtXP65FRKUg6iLGrAD1IqI3hrjMq4WnZDyljFAPYPqA1YwAt73lH95ZzZqjTqqoOeYa46etNIn+LvEAZF9Z+TUs74tq/lM+HpGQrOoMw0EgoR9kQlGWlxqvsz6Ecc80vV90wsQaSNQ3q61Warfgsifw4yvgAm/BDqNytluOhP6nkfKoxKjSLOZqSqzU2EKZbCL3CQiorQc/7MDP42qMF9/owMoiIO7+AsfR5o26uSHWcGwpGqDFEAOqqQb9wGubPV6GNnldosZc9Qa61GC3OuRkQcqX7PXwLfB+ivDxGdAUvuUaQhiwMG+qDkeIiIDqsXCZ0RmXcMImMK0tWAaNiCzJiM3PGGysJ8/ch1j6oZaYC8Y5VDz34EfSowmOzIwAC0lqt5P2c6YtA672CjIMnGveeO5d8fVLJodCJOq57L52YTGWHAoNUwKjVqUO4zj/8tq+aaRfmcOSWV7fXd/HROFmPTI/lgTxvBkFIk+sNZo3h4RU1Y2OQXj2+lINGOy+3HN+gxu6+lj5V727n95OLPvK4kh5k7Tymhz+sn0qwPS34eDAiTFUoWKyWxrc9D9gxE8lnIhCL44A+DjGxlDi8mn4fs70bs+xDZ36lsCm0JajTE40KMPlnpsn/HIIRwAA+jJAQPXxgjICoNXEr0huTR0N2E3P2Wejztp2iEUOOQWdOQKeMQbeXIPe8jbHEwOBYn6zYgjv8NYuxpyNEnfytEpIQoMwlfUinPqNdywYxMJmc5kUBhkh2z4fBdUmUoqDTsd70BNetVBWPxXYowBoqYFwogrLFqYmY/WstV+6h8qXIV/M4G6AMzyzgUOHy/TZ+BESUWw6evW0IINQZgjkIGg4rJHfRBwIN0d0LliqGDa9aq3uZ+v2GjErgAoLkM+eZtAEidEU747SHpaxp0Wo4bncixRXFsrevmkv9t4qdzsrjzJWUSMjnbyT1nlLK6opPm7gE6+rzc+67atX+4u42iZDttPT5+97qaad5W6xqhkR2SEAyFSI+xMDY9is01Lgw6DceN+WInGrNBi/kQSQ6SPFqNu/n71Y0fa1HBetYVCF8/0hYHIYlsr0bY45EbnwBA7n0fMftKRPFi5IYnke/crTZqo09CfMZ34ghFEDgDePnbvpDPg7A4YN51yPqtCK0BaY9Xym85M9T9FDuSXCk6q1WmpjMiixaOPJlPVZKOFJZwpEXP1NzDP2DJgE9ZtG58EmzxSiBo/aODzmODAToyUanEtVeo/nPtoOx0+kTVrtDovqPjVcPwXQjQR0TZDRRBLLEI+fZdyt8UYMGtSvqzerU6KHU8Uh+BWHAb9LUoW72lf1IMx0nnDp0s4FW90kNIPDLotbi9AfITbLy3c4i9vLaik56BAAl2I3qtoPtjRJTOPh+1ne7w4/WVXTz6s0nsaeqlyTXALScWkhUbgcmg477zxlLT3k+URf8JkYRvGkKjBUsUsrVcqbhtfFL1+3e8hoxMRHhcSFscwpGKrB8SZSHoV97gG5+EhsHntzwHmUcNba6OQAgh/gXkD3tqqZTyjs9TlBJC/AT4CUBa2reo6GSIgMqVyJbdapEbezqMP1NlZQPdhIJ+RH/HoPGJcpQiMICIcCL3u9LF5qq21Pc4+OiqQy67V/3b3Y60xUNiqapEDkJYY+HYa6GnRXkaFC5Uo6z+ASXkdNRP1Pz0dxlH+pjVEVN22w9P9xCZDKB5F0w8G5E1DUJBZE8TvP0rZGKJmrNuHNTh9bkRetOwzNqmRnoOMSItemYVxhJrM+ILhNhc4yLWZiTKoifVaeGuU0vQ6zRhu8mceCstPV4Wj07ipfWNDARCJESaSIg08exlU/D6JbF2Q7g8nRhlPvgeswcCrQEx5lTkrjcgdSwiNlfZR/Z3IfebyscXKsGLyhUqOMdkq93+8GqKVq9+jmBIKS/+4qM+8Z4HgAcAJkyY8O2tLgN9Q7PPANVrkLlHK5JfaxkkjUJGZyqW/twbwkJBcssLMO9mBFKJDFm/wySkbxPDlcMAhEDMvHSovL3/6UG/brUlVMmIAMXM/65DSpDBLz7uG8TXyaCPiLLbfsioZKUS1temxnNissFVj8hrQi7qAAAgAElEQVSejqxcpfSfAboboHjxUICOSkNGpSCO/40qA0UmKULF/vMGvEqF7CAGhfLmXs7/1/qw1OZfzh7N4jGJHJUXE56vPG2yuoY0p5mV5R24+v38/vUyJmQ6ePHKo6jv8pAVZw0LMBz2aCtHfvAnRVSJiFU96chkqN88dEzLHoTRqnzAe1qQcblqIRl9kird9TQiJvwQvlO+tEcYTDY1t9w06NCWPQO66lVwBmjcpqYoANm8W1lTujsUgcwchbAd+lnn7xKkx6WSD6NNVSEG+lSryGhTKn0fPz4woNa3XW+ANQ7xf+2dd3hU55X/P2dGfdQrqggJAab3bopNMcW4Jk5iJ07ZdbIpTrzJbuLY6XbaJuv0bJLNpu4vXnu9sRM7bnHFNmDAYMD0jgB1oS6NpDm/P86MRiMJIYEASdzP8/AgiTszV8Pce973lO939OJuwdmBobeDHsxpN21tBvX1KiPoShuNb8lnkNrTEBaFbvgNzLjNhj1ikpCZd6AttbD7aVs5rv6arTZTCjpWk91et+wAuuFXNtI17yMDVpcurWnuCM4AB0rq+ezqsT0eGx0Rxo+eO9ghPQjKqHQPY8/ReXo50NrTJhkYGdfdwKLNa415p3fZnxX32YIoOsHS1gAjZ6F1pUhTLbr3GStFZE4wD9qlnwZfO+IOt9Gt41uswSV7KjJ6CRIz/JrHBiMSnQCL7zaBi7BISC2CkndCR6ZcYRbE0wpNCrSt2R675B6IczTT+4rWlaOv/NCul8Q8WPoZdNNvzNd5zLUw833WF9AJiYy1BrGpt9r9LSwS9Tb1GMyvXIZgk9hgTbtp5VGbvWxtggV3IZndu5G1/CC67VHIn4vuec7GC+IzkYyxNspzdBO683FzuFrxRTQhF4nrveFDG6rR501aEkBf+RGs+Ybt8C6QrKRoUmMjqKj3IgJzCs+e7isaEctDt0/h/v/dRbIngvtvGD+gXdYDhdaXo899ywxOAFn2BRg11/6tqQaNiPE3pGyFjHFmaxcWjiblIbPuAPWh9RVQW4LWVyJjlqEJOWhdObjcJqoQmNeuOIy+8G/2dfE2iEuzuvQQpy+i+oMBiUs3+VU/mjHOpCOPbYLCRdYfULIb3nnKOvO3/LcFC1+b2YUOC0/hS0Dl4WCm4sxxtGSPBWf1wb7nTTc7b0boY9KKzLq16jgyYrzdF5uqYeE/XbTplCHJUAvQgxFtbTLJQH/6TJ99AG75UUeaTL1NUH0MSvaYElHxdpj/D8iCj0J0gpnLl+6FnY/bEzZUoMc241owzRSpSvejjZVIWhHStSnC12buSgGa66C9ZzvJ/lKQHst/f3wOB0vrSYuPZHIvfrBhbherpmQya1QyYWFCSuwgnQOuK+sIzgB66FVk1FxUFcr2IxWH0BETkYxxaEwKuNzoG7+EMdeipfugbK+N0U17N3rkdbRoMVJfhj76CWtMWnFvUILV2xDy0tpQfV5uZA4Dg8QkwazbYcotqNuNPvdtOGXmPlp9wryj60rRxiobtbr2X8x8w6F3ulh5SkQ02jmw9NABL2ER5nGfmIM+/jkrL4CVl9Z9CzmLwuKVhaLDoAZ9+fG1h96M27wdxX1tbUJ3PQFbH7aa89wPgyvMdtMxSRagwdJtnVWNAjvgsoNQvt8axN78A8z7cOjK3pNsQigv/8Bq0As/NqAzuEUj4iga0bfuardLyEgc3K45qmrvT1ON/SBzov1dshvd/EdbxaeMQmNSkLgMNCnPREp2PgHjViIzbjMJ1g2/hnavBfQ3f2cr3SYv+vovYe2DSHikdQAHnLGik5CsiZfvFx/CaF2ZX6NZYMS4C9LCFleYyeZ6G9GmoOoW3kYktRCtPY243NZL0NoCToA+N6mjYd4/wIGXIG+m2X2OXmyqbeOWWxOlH60rs2slNs2mJrTdrq8A3ia0tQVKN5uSYtZkyBg3ZMbcBp4hVoM+G5cz7SaRsbDgo+izD9pNe/HdpkYFtjLc6m/88rWhe5+HtNFISj76xn+a9+niuyEpD1nyaXTbI6aoU7QUrStDX/sZ1JXa68y83VSSOgVocbnRgvnWbCYuiM+4uMbqQ53Kw8iUW8xbOzIWDTTaNVRBSj54ZkJzDZJaYCnu9jaTZt34X3DwZTR/LrzzZFDWU9vtfQ/sGMIiwP/+S1y6jYk0VkFkfKgOu0OfUG+jvfdH/TrZBQvh6k9ccK1SImJg1h1WgvCkIrPvtMWZtwHd/Edk2eet0czh3IgLyZ2BjpyDK5A1XPhxaxKLiO3w39ZTO00hMSwGWfxJyw7GpsPSz8HzD3Z0clNbGlRS3PYosu7bQXWxKwlH6nPgkKxJcOuP/KvDVFupgzVuRcYGxwri0iFzogVev163vv4f1gw2ejGSNxPCIkxgoXRfR3AG0LL9SNE13V/bFRaUFu0nWluCHt1kC4tR8wfchONyojX+ZrDoeEgpRMLCkfQx6JP3279HxSFrHkDPFKOv/TS4kp90AySNBHcUHHgGrTqGLPsC2tYERzYiM95nu2YRNCoBmfsh9O0/m2XhvH+09J0f8aT0qPHs0Ee8DaEd9MXbwNsIA9BMpMe3ItPfC54kC9TaDkVL/YI1sVfwrq3vaEu9jabt+D/TAlj1FSRttGWQwiNDj3v9F9DajEx/L/r379j9T1xmz/qunwACceno7qc7vYAPms5c+l9sUKDgcwL0gCFx3eeSJS4drvsK+tbDEBGDJI1EwyJC68RtLaDaoTimZ07iK3kH4rMgczKctlErGTm7Yy5TG6uhbL/VoNOKur22trag6kOqj9uHPCkPifR0OaYZ3fgba5oBc/NZ9WXrgB3iaF2Z9QLUnAQEWXmfNX+lj7EVedMZa9BLzLaFUOc0W12p/cwdbv7BgB5+DVn0KUjIQJvrrLs7MhZprEKjcmHdd5DwCCTS2XUNKJGxULQE9jxr3xctsRT1QNDuNSGTxurgvOmBl6yL2xEo6Rs1py04g82R73wCueaz3Y8Tl7mJgXXLB8yE1IdWF+PK6OROlVZkSoltLba4TRg+m4Z+4+ygLwHxI2zU40yxCfEnZFvd+LWfQVgUMvuDcGqXpVsjPOj+l6ClFnY8YR2Qk9ch4u5I82hbq+3Ydv3Fnj9nGiz9LBIVa/PQh98wcY2UUR1ylEx/j0lPdh4pam2C8gPB76uO+EdNhn6Apr7CH5wBFD2yAcmbiYjL1ME6E5du72HxNusTKFiAHtlgF0fREjjwsh3nazPRfjDpyHXfsee8RL/SlYiER9tnN28WIOadPkBGJDLlZnTXXy3LFfAbjoxD00bjctLbfcMdHlriiU7q8TCJiIGr/8maaaMS7D1v99oOukvWTtKL0Bu/Z82v0YlIwhU8H+0E6EuAO8yakiqP2PfeejRrCvKun6K1py291lJvwhZL/xmJjEHf9s/cvv1/SOaXkNxO9pKtjUFpULDA0lSNusNMaOOVH8L4VbD7qeAxh9+w+d2wSPNYdYVZjW3SDbDpN3bMxOvP6k89mNA2L5wptuxBYm7P9cjoBBgxEcmfbQuRtLPXsCQmCRZ9CioPAYK+9ShStMgsQXNnojWloK1o51DcXAstdcC59cMdLgyJSbLsx0A/b1IuzPmgjc3FpUNDJTJxLUTFof6MlrbUW106LArxtUJYdLdM1BVNUi6y/Asmc5uYg3TVMu+EpIyC1V9D2302SlVzEuIyui2YtbnOeg72vwC5M9EpNw1vW8mzooAToC86Eh4NCz9mc5beRmT2B5DYZAB0w38G69Ph0VBxKCgRmZyPjFtuA/3ucEgfZw0XER5rltnxZzsuZ5rNE55+B03IBsSanhJybGEQl46MW4Y+/i92PkvvQUfNtyA9bgWkF1mtI3kkEj7Yu7B9prH8yo8AhVl3wMTru+2qJDEbJq8z4wowLfM1D0BSjqU03WEhoxziSQZPMlq83cauNv3OUqCArPySaZ6XH/AHaTWdZk8K2t4KpfvQ6uPmbpY+Jth/4DAo0cYz6MGXoeQdZOxyJGeazUHXlVudtKYYmXk7vvSxsOm3FiyypqCpBVBxGBZ+1FG98iMuN4ycbSNT7vBeP/uqaroCvnYruZ1t3rniYEdpiXeehBFXQcEV6KmuODXoS4Uk5VpHr2po80neLDj2ph0zaj66/qfo1Z+wG33B1egbvwJAeQS5/kGzWasvR7KnoJkTkbYWVNzwwncseM26w0w13vwdMudDaOZ4SMqz8R9/ukRf+w9kxHir74jLAv55OsNo1TFrXotJsgXEQNUHz0ZznS10AuMHW/4fFFwNPXRIa8keC6QuyyxQfRxqT6N7n0dypqKeVMgYG6pylJhjs+qBLm1MecyVNwONnGb1a2+97dw9KWjJbvSpLwGKisukWDN6VltzGCQUb7fAC+ixLcgN34X0InTHn+GEOSbpSw8hSz5jfu8AJ7chmVehJ7dZc9nENTYqufMJiElGrroOSehbNkVbm0zzfRA0oWlznW0QIj1I1Pmr/vU2L66qdu3VnEZf+r7p18//Rxi7PKShsoP2UPOdjnr1FYezg76kiLjoWrCU/LkWIKuPowlZVqte/1MYc42lxjtQaKhCq46bNV5TtTm/zP1wxygQrc3osc0w472w6qsoYrO33no0Kt6fksXS2K4wk6Lc87TdrNzhyIr7IGdqn38frT3tP5czFi4XfRIZu+yC3qNzEhZhHetNZ2DS9UhkPNrW0mMdWHKnmaxnWzMy/x/B50P3P2fSjn7PX0bNN/WigH93bKoZlfjNExC3jbDhF1foGnzryulYLKgPGioIVaJ1GGxofVnn72zBBaFaBuqzxWsI/u9b6vD5dQ04tN4ObzwDS+7uNehqeysc22yqWSn5MP22y7oT17pyqwkXvwVZk2HRJ5C4gRsF1JYGqC+3vph9L5geQCD4vvErSBuNr/KYvQfpY63zG2xueuQca15NH2s76CsVpwZ9eZGoODRvpo2NlB9ArvmcdXw3VEFhlnU+tjZaEA/s7gICC43VUFeKKNYMpj5rqKkvt9r1zNv9r5EA137OOrZRZM6HkOgE9Exxx06C9lZL62aM7bt6UlNN6AhE8Ta4yAFawqNh/l1QeQTd/HsTPtj1JLr6q6HmIa3N6LbHgkpRlUfM3GL8Ctt1g+1ikvPh5NtoRIzVGVPykbRCWPuA3ww+pXfLyMScYMNLeHTIjLrD4ETyZlpzWEsdjBhvC2NVZPKN6KldNrc+YQ1aXw7jV1u/R850tLESRoy3IsdbD1v2K2DIceaEBZ/edsXVJ9AXv2fXadURNC4DmfGeS/Z7d6PigAVnMFOesgNWEx4AtKXe6tLvPGXjhwvusoVR9TE7IMKDHt8K2x6xMtJ1XwF/n414UmDxJ6H5TnvsMJgqOW+cAH35kbAIyJmG5ExDK46AJxVam9AXv48svccCdNwIEzdprg19sCfVAmvgP/Ltx6zRrGgJuu8FkwZNyrUGjeu+bK8X2Jm7w4MLADBxFVc/3LBiUixAnSm25y1YeCFvQ5+RxGy06qjJdgI0Vlpt0B+gtbXFUncN5cEHNdUi4dH285QCqDpmXbx7nrEbsrhMYKauBJ8qkjEW8Wt093ouaYWw7tvWNR6XbnVoh0GNpBbADd+F5lrb3b34EJqUAxPWIks+bZ9ndzi6+Q+QPg7WftN6GOrLYdv/WHAGqD1tvQniQma859z9G+3e0BtuQM3uctH1Wu+jE556G61O7G2ElFE977prTltwBmuyO/QaMmYp6nJDS71dewE/aECrjoQ0wkpknGWxrmTUmYMefLTUWWonOR+ZdgvUl0Gb124Wq78B6UXIss+jJ7ZaoDpTDJ7k4K46JgVO70aPvwkz3ou2twbTv7Wn0ZLddrPJGG8X1qovm8RlVDwy833B4N0HJC7N5oGrj0FkPKT1stMcILSh0n73rqM20VY/05rTlilwhyPTbrOOdvXB3A+iTTVw5HUb3Zj+HrMWbKzyP7HPgv6Bly1lH58Ja77eJ1lJSS3ofZftMChQ9VmjX8VhJCHbNKSf/prNQJfthfBo2zUf3QjhUaa3vvd5JCIGifSg4kLjAilpQcavQsWNjF2G+nfWvZKQDRPWWOCKTkSuWtH3c688ah7lER5k3PKBMfJIGwNTbjFf8/y5fVbr0sOvWxkOrMdj+b3WZNmZsAgrAfj8eg9xGShukwUt328d3OLPNogL6TwH7eDnwv2gReTXwHjgKVV9oId/TwAeBtxAA3Cbqnq7HhfACdCJ2ZA7C8me1JGSJm6E+dnWV1gjyqh5kJwPFYeQ+Cwb7N//otkcjrkG3fEXZPxqdP1Pzexh+b2QkIU+/XVoKLeK6ew7kSk32YWx6qvgclmNvJ9IQib0tTnG1w7qO2/PalWF0n1IY7XdGGd9AK06jOTODM6I738BTm5HZr0f3faIBeLwaHTkbKS+HI1OhN1Po+4Ic6cKpKcBiU23HTbY7qi5rkd7T4chSsUR9K/32Tw7INd9KfQG2FAR9PBubba095LPdKRYJSIapt4C+XOg6rgpXlUdQV1hyK0/Omd5Q6LiYOb74KrrbAHQx8+WNlSZ6E5DhX1fcwqu+WzPDVb9QGISYMZ7bNQyIqbHxblWH7emuKgEyJlsc84HXgoeUH7AylxdArS2NpnC3sFXbfxq4lqbenjyL1C2Hy3dg0y91e5tcRnOAvdsXIAftIjcDLhVdZ6I/JeIFKnqgS6H3Q78u6o+LyI/B64D/nK257ziA3Sg/qKb/0BH81FdCRLuAY91G2tTjWnVxo+AwsWm9R2XBhNWo0c3wqQ16Ks/sZpYe6t53a64NzTle3wrvsIliIB4ehYXGEi0+ril4lsaYO4Hz2/FXLrHTEHavZAxDk0bg0y7LaT2jLcR4jNNIarmZIdQi6QWop4UGDUfSR+LNtehyXkmGFN9AkkeiYbHmDBJ6R5Lr8Vc/PfF4RLSWBHc0QHqjjBTh4OvmCrc6CVooD8hLAqyp4SMAqn6/N7ShfZZrvLrGvja7U/guOY6W4j2UDuVCI/1k/SHtpaO4AxYR3R7i+1SO59b5VForjGFvHM0n2l7K+IOt8VydM8LZq2vQJ/+RnBRP/kmXHPuREfOMZtOgPhMy8h1flxjtfnZJ+bahuHkDstoucNh5h222GhtRn0+JG+G4xjWG75ed9CpIrKl0/e/9FsrB1gCPOL/+jlgIRASoFX1Z52+TQM6d1B244oP0OA3m8+ahO77u/0gwgNZkxH/6l7bvcjsO9F3noQ3fwuTbrT53r9/10Q5IuPsRhIYTwiPslpzwFkJkMIF6F//FfW1wfIvIulF3c5D21qstuttsBnp89xNamsL+vqv4PRO+/7ZB+Dmh0KeT6uLoa3ZhFR87UjVUbT8ADJyDmROMFOQg68Ex59K91pqMdITklqUq1aaTGdSLvjvn0R47CZScQiOb7EZ2OgEZOHHLeC7w9GJ18OZk3bMhNWQP7ebybzDECcu066N1iYzQDm+BUYvQUYvRsOj0IRs5OqPQV0FJGZb6cKP1pyypqe6Mmu+nPcReObrVk9d+E+2EwS07IB/EdlqUw3Zky/8vGOSYNq7YNujgFhjWUSXccbSvehTX7YFSEI2XPelkCDdIbzSWG2GPSe2mgZCwfyzB0hvQ+ii/tROfM31kDsdic9AvY1I+hgkYAwUeK32VpMs3vJHa8Rc+E90jK9kTUJufsjen7gMJzj3huq5AnSFqvam4OMBAnKKVcD0sx0oIvOAJFXd2NsLOgE6QO4MZOX9aH0Fkj4WSR3V8U/SVIMe32x2bgAbf23d361N9v3+F5B5/4Bu/19whSOLPmEX1DWfNa/bNq81m7W3Wr11w6+t3to1ZXZ8M/rC9+zrsStgzFIL/C43euIt23XkTD134Pa1BmvkAIWLrE7ua0WTC5D2ZvTpr9mCYvQSJGtSRwOJ7n4aueE7VutK7LRTdodbk8uzD6JjrkUzJ+FKzrVO6jl32oo9Mcfev+zJkJiF1J6y4AzQVGPZhvw51jQWm2qWku2tsOm3tsN3xCiGFZKcB2sftOzJqz+GuhLY+QRauBBZfDfijjAFui49T6pqLnOBkapnH7Agc/NDpqnvSUbc4WhLg2Wu/BKz+vy34dYfdrs+tL0VkJCUsvrazzqiJeFRtgjPmwm40LBIpOYUmpDV4VynJ94KZgdqTkJtCcSPQL0N6OENcHi9iRNFxIA/q6SeVCQhG20ot36MtKLQe0BMkomQ+HUamH4bbH8ETu82Y5+00eZG1fV8G6rQQINYu9c2GrkzTKQpIua8jX2uSC6si7seCKyAYumYEwxFRJKBHwO3nOsJnQDtRyJj4Sw6z1p+qPswf2uTXQQntlr9rLUZFn8aScy2iwL/jvjgKybUkDkBFnwMXvkRMm4ZHN1gwh3+i1RV0T3P2XMn50NULPrXe00O9NibHS5bOn6NeVT3cHPR9lYoO4BWHDKlpi0PWzNXUw368kN20NRb0eoTwd3+ia1oZ+MP9UF9pQXoqHiYcrONluXPQzf9FhoqrOln0Sfxeettl+EfHdFxK2DOh2xXvP8l65rtrBucVmSduVv/ZA5kcz5oixX1haRCHYYPkpwHNafQupLgD8sPmvez+yw1XfWZbWyAdq+5MnULND5bjHZ82xZSQ9SWBqg4ZGn0iBhrXIxKNAngkneslj1ueY+ZG4n0oEn5Fvg2/x51hyMrvmga8gCZExFXGIrCnueCnvBlB2D9T+zrkj3orDvs69GLYeRs9JUfWDAHZPm9tmANvGZUvN0jxq+yLFx7G1q8AwoXoBt/DZg9pC97KhIZ26mLXa1E0OY3oPGkwFsPo1XHYOHHQktSZ0Fbm+H0O5ZFy5xo45/n2bsydDnnDvpcbMXS2huBKcC+rgeISATwKHCvqh471xM6AboT2tps4wwtDWhyvn1AwyKt2SSlAC3bb81M41babrBoqX2YtR3d8bilhhd/quP5pOpo0Mqt9jSSNgbm3GmBrqUecqZbKi0pB4mMQ3Om2Xxk7gzY9Vd7jshYtJMFJiW7LLj6FwEhVBxCn7rfOqQRZNVX0OgEeOLzwWOKt5lMYIC2FmTEeDQ8yhYZCdlouxdO7bLRjf0vWg3w1K5OdTm1elzxtmBWAawbfvxqey+89baCn3UHenA9JOda3fkNf8mmrsw63JNGQvYk+9theBKdZAtN/2eaKbdAL/ra4nLDtHej5QfsMzlhLVpXaiN2flR9Nhp09SfMSrHdiyy5B42Ms7nplnqb+93wqw5pXz081nbxB1+B1EIkdwaUvGMyvj3RUA6b/WYt7a3opt+bZ3lrC+x9zlTPIjzI8s/bohpCxVfaveamF5eBZE81857a4EJFj25E8ufYtENzrWXIPMloTCIiLnyl+2HW7fDSQ4FH2L1j7HLLzM16v6W7PanI3A+jh9fbe114Nbz1sN0Ptv+vjY6ei7J96LPfsFe5UhX6LtwP+nFgvYhkAauA94jIA6p6f6djPoKlvu8TkfuAn6vq/5ztCZ0A3Zljm9CXHrLace50Wz0nZFsNrLHKZD2j4m3XnDzSgmlCFvrmH+3xk64Pfb4eZuo0aaRZ6yXlmfDJk/ehOVNhwUchb5YJmoRFWyqrphitPGoCDcc32xNMWNuxQ+94Tl8bVBdDzalOHzA1M4L0MWjebDjymv04foSpGLVYvUvyZqE1p5FlX7A51aoj8PIPUZcbWfVVS5cVb0Ou/Vf02AbbFY9agLa12k45d3rw3AoX2wq0pc7SdVEJNtoxcS1kTvIrSPm1tcGMEK79nEk3DoDfsMPgRCKiYdq7bbTIHW79FeeaYIiKhyX/jHjr0doypK0JbW+zGd+Dr9pisGipNSHe/JA1cm57xIQ45t9lI0e1p6yJMXAe4ZFooCO6/IAtiL0NZx/Xcvt1+ANBN6BbUHMYApKk/pS2K8tf+04thORR1tAWn2mZorUPmnJhXYn9Xn5tBcmaZOpiL//AFgoT16ExSXZ/GXONlYKObYbYFKj2/x6eVCtfHXzF0uGxqUhcmqnxxY9ABPTwG3YeGeOgobKjHt4bWtepV0l9oSWyKwa9oACtqrUisgRYDnxXVUuAt7sc83Pg5319TidA+1FVs50EC1pb/EG3udZWyuWH7EM7bqUFpOZaC1bXfNYCUGIuMnJ26HOmFthu9dRO+zs+A7b9jzWQ5c1GyvebDObuZ+DENluxh3vgnT9aQNz3nAW4CWuQCWusHp1itXH1NllAdoWhTWfgma8hsz8QFEIJpLzOFEPBAiTzKlMTShlleuJl+yAiBt3yJ2TJp62j+sgbsNefZm9vt5GOlV9Ejm22G9ukm5CUUWh0AtJSa3W4q65DZr3fbkYjxoO40KQ8+32PbUI3/QZiUpBVX0Ij45H5/2DWnXHpSGIW1Jb0kLp0GG5IVJyVefqIhkfBjv9DS/fa94m5SO4sKN0HG39tP2uuReJHWFBb/1NbMIIZtqz+qgW3qbdaGcYd1q1+K9EJqLcFLT9oddryg3ZdJ+dbqSouA677st0L/LP84g5DI6LtugyMjMVn2Ehj6V4zf5l6CxqfiUTHd9TDNTwayg4gU99lI1FJuagrHCndY8EZcxHTN39nx5/ehay4Hz3wopWrTu0ClxvJnY6u99/fOwUTScyC9hb0z58LntfkG5EZ7ztncAaQlIJgFi068cr1hL6wFDeqWk2wk/uCcQK0HxExCdCT2+nY4QVQtTRRfZmlj7f80Y4Jj7KuycLFkFrQURdWXztUHkFa6tGc6ci4lWhcBrr9UUtNxyTD7r+hJ7bY4+fcaSv97Y+ZR3XeTPTUDlyL7+7xXLW9FS3eDqW7ob4MKViEZk5Atz+GTL3FbC2jE9H1P7fZxw2/st8oPBq58XuQloss+pTVteNH2Lm3t1mNbP+LVstLGok2VlojT9ZES1d7kiBlFK7oeBsbWfctyywkZJuCWoDZH7ARrcOv2/eNleiBV2zXMmqe6Y8316Jv/gFZ9y0bk6krNa/upJyB/pJNpfgAABRESURBVK91GIKIOyIkHUztaQtAASe6xBykcBF67E0rnWSM7QjQJtUb01FekSWfNgMbTxpMuw32PQcjJljpaOdfUE8KMvP9Vh8GmxNe8w0kLh3JGIsuvtvS2gFzm6SRyMr70J1/Nb/sggUmhfvUl63cBciKL4ak5CXSA1NuhKZa08v+m78DfO6HA79wsOk0QLsX8mah7zyNTFoHcelofaXJm+bOMtW1zrQ2hc6ZexutB6Av73daIaz7jl3PsWkdEyxXFI6S2OBGChfZReDzWZDZ+jAkZCETVpuJecIIC0zLv2AfZF+bdZF6G5Drv4kmj0Ibq5CmM2hDFWx/FKqOWvpp0g3WFFN93HbogXpcuxc9vcsUfwCqTyCjFtgYVxe0rQVK9qL4rBbt79zUE9uQxZ9CX/w+uvMvMPZavxe2zxYRAVqb7KIVl1ledh71CovAlzoGWfrPcOaEyQvWnDbFs8Rsq1O3t1p9vs3rN7I4y2y1O7y7rGJkrM2TxiRb+ru+HLn2c6YU9ebvYd/z9v6s+grSj52WwzAlKh5mvA9e84+NzrwdohKsZBOXYeJBYRGw9w1zuMqeBhPWwu6/2eLTk2o74KzJFtDqy5GT29GMMZYaP/EWbPD3Q0Qnoic2B1+7rtS0+ePS0YpD8LevQksdOnK2Gb3EJFlpJ2dasKu7+nhIcNQzxd0yahIWCXFpprngb4rU07vsdzv8hmkHxKbbRiCtCE0psDJU/mz0lZ/Y849dBrf8EIlO6FbqIiHL6umHX7Pa+Njl/XrLJXmkle6uZC5QSWygcQJ0JyQ63uo6LQ3WhDHpBru4O9XLxB1unZvNtTan6Uebai3INFSajV5YpNlPbv6DjSJVHrYLB6yTuZOiFsmj/AEVGL0YTR+DpBeZAEHTGTQsyurJ3gb0+W9ZPa+zQ1C711Ju+fOQ7MlWi1v8GSRnOhoZF3yt/HkQ131Mo+N3a6lBS/cinhTEk4qOW9HhOuVrrIKdf7XRl9xp6PjVSGRct5lMANpa0CMbkJm3o0c2mFrUiPGw+Q9w6FVLNS77VxsbKT+I7nu+4/fQHY87AdrBslFFlplCfVZCCouwheuaB6wJ7NCrdi2B2VOOX2kz9XHpHdkscYfZsa/93JoawUpGebPRwISBz4dkTgpmfGJSICYRwBocA650x96Eies6BHVCUsfxWbbzriu1rFjmxLP/bvlz7NwBqo4j8z+K5s81i9qC+Uh8llnbxqagtaXokY3BwLHv78iENUhEdzVBiU6EBXfBlJsgPKbPdpwOAZwd9NCg+hi8ERSIUQh1wcnw27G5w238SlyIS6xhZMef7d/aWizwjBgPVcetKSzwfHueQZbegx5ab9KWjVVWM15yD9ScQtKKbETkpYdM6CQ+E7n649YkI27Y+Rdk8d2W5m5vhfy5aNpoS1NVHEGu+Rf0he9Yd2hyPlz/TaS91Z6nk9qSnjlpM5wxSdal/vZjcOBlf4JfkKWfQWOSTBu5ZE/wd9v7PJJxFdRXoiPGmeNQ57GvyFjIn2MmB2ljrOkuNh1m3mH1+zHXBrWNw6JCFyt9GAlxuDKQsEjopCzW8fO4NGuMqjgUWoyKiu9ZM9vbYKOOAY5uRKfeal7j9RWmgHfsTWTOh6y5LHtyUHSkszGFuMwFr6dzTcg0Cd+6Uqvh9rYTzZ2BrPmGSdsmj7RAvPkZExY6vdPuN6u/YXXlsddatq10jz02whOaFet6HlHx3ZTGHPqB42Y1FOjSVNFl5liiE9CRc5C137TaWFw6qFrtufM8YlQiTH03EhYOIjYGUVdmspnqs/Tb9v/tGF+S+HR05xPomKXIqR3WyAVmunFqp6XBZr8f3fRbdOvDyJoHoKUWVUHK9lt9POMq6wINpJirjiKNVd0b2GpOoU99KegstfSzSPYU09z22wFqdCJSth+fJxVprg99T9q86Ft/sseufTBkJENcbhi9xBra/PVsifTAtFvRyTeEzlcmZts42I7HzQVs3Mrz+h9zuALJnQaTb7JpiqtWWddzT0R4LCUe6LwuXIRExCLpSWh4dIclpRa/BTnTkQmr7VouP2CNWdf+C3psM1Iwv9fA25tOvtaWoEc3mSRp/hyk86gjdNHWlo4gLKmF6KQbwZNmafoJa5B4Z2d8UVAddHoMToDuieR8mPNB2P4YpBRYE0gXRCSkjqutTVB52ATr9/3d6mWTbkAyOtV5r/+2zf/WlZoyUXxWqOavuGDau5GGChuD6vx64dFoTbGZTsz/KKQXoRUHrUN17DL0Lf8oXdYkmPqu4AMjYyEiFj25A/Ukm9RfRKzNg3Z2ljq9C6qOQvZUdPMfkBnvg/U/s0aamCTzdh452zpj08eY+5T67E/t6W4zkxIe2aNbT1fxAxGx+XEnrd2N/jrfXGmIJ8V6Rdq93d3WOh8XGQvzPmyKeu4w25XXnsb39mMWMJd8Gn3lx/b1hNXWMFp+yIw+tN3mgtc+iIy46rzOU72Nlr4OCPocexNWfLGjfAT+yZG6UijZg0xah8amoXv/DsVvIYULYdqtvf6ODgPEBZhlXAycAN0DEhFtNnWFV1vnc0+iIF0fEx6NZk6yecIpN0O7D3WHhe7Fo+MtXbXjz5aay5wIcz8Eu560G01EDBKVYEIhJ7dbrfnk2xYQKw/b67S1mEjKyJlw+A1bTARqawCndppt38KPQfHbppX97APW2epJNSGR+jJkzLWhzlLxI2yRcegVex71daiX0VgNZftt0XHdl6x2F6i/i8uR6Lx49Mv55kpERGz88FzHeVJhlPVLaEudzR77rymtOg5rv4m43UHBkfryYN03cC2cZ4Cmtdl24wEqDtrPOgfogLJee5tJkh7fgvoVyfTIG5atyxx/fq/v0EcuWElswOlXgL6SVvTiDjfJvP48JinX3G0qToLLhR5ej8amBrWBvY1wZEPwAad3IQs/hubPha1/Qg+8bCnjZZ9HU0ebzdzE681wYM/TJtMZk2QB8chGKFwIO56A7MkWQCM8tjhoOgOZE3FddR2+Pc9acAbbrbd7Yc8zkD8HWfsgWrLbjDGObLC0WtZkm6/uKqrvCoN9z5uBxi0/sExBaxPit4sMuPU4DBz9db5x6CNt3tAmy/oyxJMc2vAYnxksV7nDg7aY50NUnF3Hfk1uipbatdPDoQG9cG08E/oPLbXn//oOfePClcQGnP7uoJ0VfS+ICL7ibfD2/wV/OGapNWsl5doMdOFCqzuD6fpGxSP1lRacwdLNO/8CK+9Dxq0wH9voBHwRHnPS8jYhs2zkRFMLzVNZfUhakfkwv/oT1NtgUomTbzLxg+AZBptc2lqQnGnWLV51zOYe49LBHQkjxltab+k96PEtSHI+etK/S/e1IarW5fr0D80rF0FWfTmoU+xwXojIL4DOtYIXVfXrvTnfiMhdwF0AeXl9m3m94olOtN3qq37N7DkfCmpp+5HUAlj3TagttevibPXtPiDucDS1AJl5B+AzLfvq49BpRlkrj5iGvicV0sfadRmdaIvtxFxHCveSMMR30M6K/txIYm4wILrCzCjg+W/Z/OTYZciE621+uM0L6UVIVLwF1M6SgqmFSHMtlO6FsEh8KYWw5Y/m5HP1x222+tB6m52eejOuCA++8kM2xhR4jm2PmOBJezsy+wNobal1h7/zpAn3pwVr493mH0cvMkHOtlZkxERrbNvxZxA3suiTdsMq3Wc7bQDUumCdAH1BqOpHu/7sXM43fj/aXwLMnDlzcBXQBinicqOFi5DUQqs5Jub0mP2RlILzCsza2mzXd1QsIi70zEnE2xhUJwTbUQeOrz6BPnm/TYEAsuwLyKi5sO5b1uwZk4LEnZ/1rEM/GUpz0Oezovc/7spd1edMg6s/AeUHTOFopz/BsPVPMHK2iRzkhVqKSnwmrP6a+cbGpsGoeeiL3w/WrSbfBKMW2GjJi99H25rNW7bykNXKkj1IaoGlvwO4wmyX3FhlDWTRSeb9PPtOiM+yBpte0DavyXu+/gs7p1VfNXOCgNVfdGLIokK6qho5XDD9db5x6DsSFtEhmzuQ6JmT6Ib/tHHJmbfjy55s45Iul+ki1Jy0iYpOC2Qaq0NMNrR0DzJqrt0XnI7tS4gOrSax81nR+x93xa7qJSYRGbfchAf+9uVgo1VSbq/NLJI22oQ7sKYV7dxUcuxNuO4r1jQSGOHa9wIs+QzUleHb9HvrJp90gzn3NFQgk240E4+pt8L41abJrT547kFIzEWv+efebejqSuG1nwe/DnhY+3cakpQDa75hN5PY9OBsuMNA0i/nG4f+oU01gJrAx0A95ztPdTRt6ksPmZRt1VFTHaw8YnoI098T6gMdm2r9Lg2VgCA5UwfsfBz6gTK0U9zOir7vSFQcLL3HjDDcYci4lX3qBtf6crR4mwmclOy2HxYtQeJSg77NYVGm3+1rRZ//gaVlit+y8akxy+DgizZCVb4PXv8PWPQpJHNih50cVUfQ/S8hcz5w9hNxuYNCLGD18y4ORJJaYLU6h4tCf51vHPqOluw25zpVWHrPwI35hehpK4jAtFtNNri91fQBOnVvA6Y7sPpr5kgXkwAp3cVZHC4FQ19JzFnR9wNJykMW3NW/B53eDZt+A5NuQLKnQEKOKRuJC6bcbAIKKaPQtx5Gxq8OrZnUnkYKFqBVhy2gRidAYyU88zVYeX/o65yr4zo+E1l+r6XropOQ2XeGqoU5OAxRtLEaffHfOzQI9IXvwU3fR0LEQs4PmbTORIUaKmHm+yAxD0nIgawpFqyTRvZc707MubBOcYeBYSjVoLvirOgvBf6KwM4nrGFk5f0dggaSkAWL7zZpwo3/hdaXQ/ZUm5mO8CBFS21cZMZ7zQM2Y5yNX7U2oodet/rzzschKR8pWtzrWYiIGQKkfxdcYUgv8oIODkOOzuM06qObgx1+j+SyAxAWDmljkJhzp8IlZRTc8G/Q3gIxiUiY/7o53xlqh0uH42blcE5GXAW5M+HU2zB6qRmvd0KrjpnK2JRb4O3HYPQSZOV9ZvnYSYdYREzG8PVfmHzdyDnW1LXifogbgUTHdX3lHpGAxR6YPGnA2D0u3Xb1Dg5DDIlJsvLTCybxKdd8tlvTpDbXoet/akJBAJNvNNcpbwN4m2w8MtLT8/N7knr8ucMQYIjPQTtcZCQuA5be4/e0jTVVMz9avB3+/l0LuFd/Aln2BRMtScpBXD38V7rCTOQkKcckP1/7GSAmbTh6cZ+M3DteWxWObUZf+Dc7z2X/iubN6tdzODgMFiRrEtz8EKA9TzS01AeDM8CRDeiYa60ju/KwWVbO/oAFe4fhwyAL0M4WaBAikR4kNi00ODfXoq//hwXudi+s/ynaWAnJeT0HZ7B098r7kFHzYf8LgWdCtz0aMtbRJxqrTdjB12Ydqa/8OKjl7eAwBBFP8tnHDSNjQ4V3ChaYJaxfHpQDLwUtYh2GB4EU99n+XAacHfRQQVym8hXAHQ4JWedMM0vaaHxRieB5LGjMkTzKzO77g8ttjWcBb9yIGNuhOzgMQyQqzkSByg7YtZZeBCfeCq1UO9K2w49BtoN27rBDBImMhcWfsl1suxeZ+xHooziIKy4Vve5+dM9zEBVnzWTu/gVoiU6Aaz5nNW1AFn4sxFvawWG4IbFpJtLjR7MmwdjlcGonXLXyguQ/HQYjTpOYwwUgaaNh7YPW2BLVtyavjscm5/d/5Kvrc6QXwVqbpZauZhoODsMciU2D+XdBW5NNTThjh8MLxQnQDhfG2TpHL9nrO4HZ4QpGwsJt7MpheOKkuB0cHBwcHAYbg8/NyunidnBwcHBwUKyT+2x/+oCI/FpENojI/RdyTAAnQDs4ODg4OKAm9Xm2P+dARG4G3Ko6DygQkaLzOaYzToB2cHBwcHCAC52DXgI84v/6OWDheR7TwUWvQW/durVCRC6281UqUHGRX2Own8Plfv0r8RxGXqLX6RMX8VobDP+v4JxHV66k87jo19rWY2eedf/j46m9HBIlIls6ff9Lv7VyAA9w0v91FWYs1ZW+HNPBRQ/Qqpp27qMuDBHZoqozL/brDOZzuNyv75zD5ediXWuD5T11zsM5j4uJql53gU9RDwTGXGLpOUPdl2M6cFLcDg4ODg4OF85WginrKcDR8zymA2fMysHBwcHB4cJ5HFgvIlnAKuA9IvKAqt7fyzFze3vC4bKD/uW5D7noXO5zuNyvD845DFcGy3vqnEcoznkMIlS1FmsC2wgsVdW3uwTnno6p6e05Rfs43+Xg4ODg4OBw6RguO2gHBwcHB4dhxZAP0CKSICJPi8hzIvJnEemnj+KAnUeGiKy/HK89WLic78Fg+RwMNwbT++pcY0EGw3sxmD4bw5UhH6CB24F/V9UVQAlwoa3y/UZEkoDfYTNul5z+SMddxHO4rO8Bg+BzMEwZFO/rIPh8Bc7DudaCDIrPxnBmyAdoVf2Zqj7v/zYNKLsMp9EO3AbUXuoX7q903EXksr0HMGg+B8OOQfS+XtbPFzjXWlcG0Wdj2DLkxqxE5BfA2E4/elFVvy4i84AkVd14Gc/hYr90Tyyhu3TcgUt9Ev7uRC7Te9DBpfwcDEcGw/V1jvO4FC9/NpbgXGvdcK65i8eQC9Cq+tGuPxORZODHwC2X6xwuI/2SjhvOXOrPwXBkMFxfZzuPQYBzrXXBueYuLkM+xe1vTHgUuFdVL7bm92CkX9JxwxXnc3BxcN7XEJxrrRPOZ+PiMxw+YB/BVrL3icjLInLb5T6hS0y/pOOGMVf65+Bi4byvQZxrLRTns3GRcYRKhjgiEg+sB17ALx13LnUaBweH/uNcaw6XGidADwP8YxfLgVdVteRyn4+Dw3DFudYcLiVOgHZwcHBwcBiEDIcatIODg4ODw7DDCdAODg4ODg6DECdAOzg4ODg4DEKcAO3g4ODg4DAIcQK0g4ODg4PDIOT/A3Q69qtWA8RgAAAAAElFTkSuQmCC",
"text/plain": [
"');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"
');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '
';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('');\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i
"
],
"text/plain": [
"